1.前置知识
整数在内存中以补码形式存储
有符号整数三种码均有符号位,数值位
正整数:原码=反码=补码
负整数:原码≠反码≠补码
2.解释
int arr[] = {1,2,3,4,5};
VS+x86+Debug环境下,内存窗口输入&arr
VS+x64+Debug环境下,内存窗口输入&arr
存放的顺序都一样,均是小端序
计算机存储的顺序有两种
小端序(全称:小端字节序或低端字节序)(Little-Endian):以一个字节为单位,低位存放在内存的低地址,高位存放在内存的高地址
大端序(全称:大端字节序或高端字节序)(Big-Endian):与小端序相反
3.大小端序的原因
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit位,但是在C语言中除了8 bit 的char之外,还有16 bit 的short型,32 bit 的long 型(要看具体的编译器)
另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度(AX,BX,CX,DX等等)大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式
4.练习
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序(百度笔试题)
简述大端字节序和小端字节序的概念:见上方的2.解释
判断当前机器的字节序:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 2;
if ((*(char*)&a) == 2)
printf("小端序");
else
printf("大端序");
return 0;
}
为什么将&a强制类型转换?
&a指向的是int类型的a,而(char*)&a,由于char类型占一个字节,而且本题要单独比较的是一个字节,因此,强制类型转换