字节序问题
高低地址与高低字节
高低地址:
最高内存地址 0xFFFFFFFF
栈区(从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址)
堆区(从低内存地址 ,往 高内存地址发展)
全局区(常量和全局变量)
代码区
最低内存地址 0x00000000
地址由低到高→
0x4001 0x4002 0x4003 0x4004
高低字节
十进制中高位在前,低位在后
12345678 由高到低依次为 0x12 0x34 0x56 0x78
字节序
网络字节序(大端序)
存储方式:高位在低地址
12345678 → 0x12 0x34 0x56 0x78
主机字节序(小端序)
存储方式:高位在高地址
12345678 → 0x78 0x56 0x34 0x12
例子
在主机中存储数据12345678(方便举例)
以int四字节存储时,以小端序进行存储
存储结果为:0x78 0x56 0x34 0x12
此时通过网络传输到对端,在不进行字节序转化情况下,网络字节序按高位先传输
传输到对端时:0x12 0x34 0x56 0x78
此时对端通过int四字节读取,主机为小端序,因此读取数据时会自动转换
读取数据为:0x78 0x56 0x34 0x12
因此从本地12 34 56 78到对端变为78 56 34 12
注:实际存储时int类型12345678会转化为十六进制存储
附:将188存入char类型中时,188为int类型,存储时为 1011 1100(正数原码补码相同)
在char类型中只取最后八位,此时存入计算机内为补码,因此此时补码10011 1100实际为十进制 -68
在使用%x打印时,会将其转为整形打印,因此前三个字节也会打印
打印内容为补码:0xffffffff - 0x44(-68正数原码)+ 1 = ffffffbc
附:使用cout打印时与printf不同,printf会根据%类型进行转换
使用cout打印char类型时,cout会当成字符类型打印
char a = 1; cout << "a:" << a << endl;
上述打印结果为空,a:
这里的输出是ASCII码值为1的不可打印字符,因为字符1在ASCII码表中对应的是不可打印的控制字符“SOH”
因此,当我们想使用cout打印输出十六进制时,应当进行类型转换
char a = 77;
cout << hex << "a:" << (int)a << endl; //不转为int类型则按照字符型打印,ASCII码为77 → M