字节序问题

16 篇文章 0 订阅
4 篇文章 0 订阅

高低地址与高低字节

高低地址:

最高内存地址 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值