导图
整数在内存中的存储
(正,反,补)码之间的转换
对于整型数据来说:数据存储方式存的是补码
为什么?
使⽤补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
大小端字节序和字节序判断
在下列代码中 “ int a = 0x11223344 ; ”,这个数字是以字节为单位倒着存储的。
为什么呢?
一图KO大小端概念
以上面代码a为栗子
判断大小端的两种方式
①指针
int main() { int a = 1; //方式一 if(*(char*)&a == 1) //方式二 /*char* p = (char*)&a; if (*p == 1)*/ printf("小端\n"); else printf("大端\n"); return 0; }
②指针+函数
int check_clc() { int a = 1; return *(char*)&a; //1.取出a的地址 //强制类型转换为char*的指针,再解引用 } int main() { int ret = check_clc(); if (ret == 1) printf("小端\n"); else printf("大端\n"); return 0; }
控制台输出:小端
为什么会有大小端之分?
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8 bit 位,但是在C语⾔中除了8bit的 char 之外,还有16bit的 short 型,32bit的 long 型(要看具体的编译器),
另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。
因此就导致了大端存储模式和小端存储模式。