1.大小端字节排序
什么是大小端字节排序?
首先我们在编译器中调试看一个现象
可以从内存窗口发现,在内存中存储a的方式与我们初始化的相反
可以发现本在最后一位也就是最低位的87反而在了前位(低位)地址,这就是小端字节排序。
小段字节排序:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。
大端字节排序:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。
2.习题理解
2.1 练习1
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
可以发现这里的输出都是以%d形式输出,但在初始化时都是以char类型设置的。
那么先上结果,看看自己有没有做对。
这里来逐步解析一下:
我这里使用的编译器是vs2020,这里的字节排序是小端排序,char类型的默认形式是signed也就是有符号类型。
我们知道数在内存中的储存形式是以2进制的补码存储的,那么我们先表示出-1的补码形式:
原码:10000000000000000000000000000001
反码:1111111111111111111111111111111111110
补码:1111111111111111111111111111111111111
a:
但是a的类型是char,即只能存储1byte(8bit),并且刚刚提到这里的排序方式是小端排序,所以这里就会从补码的后端发生截断。
a中存储的: 11111111
然后输出方式是以%d形式的,所以这里要进行整型升级
有符号型整型升级,以高位数字进行升级
升级后:1111111111111111111111111111111111111
再转换为原码:
10000000000000000000000000000001
得到结果 -1
b:
同a
c:
同a得到在c中存储的是:
11111111
不过在这里进行整型升级的时候与上边不同
因为c的类型是unsigned char 是无符号型,所以进行升级的时候直接在高位补0
升级后:00000000000000000000000011111111
得到结果 255