当前位置: 首页 > article >正文

字节序问题

高低地址与高低字节

高低地址:

最高内存地址 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

http://www.kler.cn/a/227130.html

相关文章:

  • 大路灯护眼灯哪个牌子好学生用?适合学生使用的大路灯推荐
  • 网络安全之SSL证书加密
  • 【Redis】--RedissonClient的Lock锁详解
  • 宠物空气净化器是养猫家庭必备?除毛好的猫用空气净化器推荐
  • em/px/rem/vh/vw的区别
  • 天地伟业接入视频汇聚/云存储平台EasyCVR详细步骤
  • kafka自定义分区策略详解
  • GPT3.5\GPT4系列计算完整prompt token数的官方方法
  • 买电脑注意事项之CPU型号后面的字母都代表什么意思
  • 前端复杂 table 渲染及 excel.js 导出
  • openssl3.2 - helpdoc - P12证书操作
  • ReactNative实现一个圆环进度条
  • 【ELK】logstash快速入门
  • 【乳腺肿瘤诊断分类及预测】基于自适应SPREAD-PNN概率神经网络
  • 单片机学习笔记---定时器/计数器(简述版!)
  • 记录springboot bug
  • SVN单个项目迁移到Gitlab,保留历史提交记录
  • 部署实战--修改jar中的文件并重新打包成jar文件
  • 理想架构的高回退Doherty功率放大器理论与ADS仿真-Multistage
  • springboot153相亲网站