引出大小端
我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。这是又为什么?
什么是大小端
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中
为什么会有大小端
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一 个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具 体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字 节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
百度笔试题
百度2015年系统工程师笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
分析
只要访问第一个字节,如果值为1,那就是小端,如果值为0,就是大端
只需要看第一个字节时0 还是1就能判断
-> 只取一个字节->强转为 char*
代码
写法1:硬核干
int main() { int a = 1; char* p (char*)&a; if(*p == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; } 复制代码
写法2:写成函数形式
如果是小端返回1 大端返回0
//如果是小端返回1 大端返回0 int check_sys() { int a = 1; char* p = (char*)&a; if(*p == 1) { return 1; } else { return 0; } } int main() { int ret = check_sys(); if(ret == 1) { printf("小端\n"); } else { printf("大端\n"); } return 0; } 复制代码
写法3-再优化
//小端返回1 ,大端返回0s int check_sys() { int a = 1; char*p = (char*)&a; return *p; //p为char类型,解引用之后访问一个字节 } 复制代码
写法4-最优化
//小端返回1 ,大端返回0s int check_sys() { int a = 1; return *(char*)&a; } 复制代码
方法2:使用联合体
联合的成员共用一块内存空间,且都从起始位置开始存放,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
union un { char c; int a; }; int check_sys() { union un u; u.a = 1; return u.c; } 复制代码