十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入理解C++ 大小端字节序

深入理解C++ 大小端字节序 这个话题应该不属于c但是我们用c编程经常会用到。本人做为一个软件工程师曾经在调试的过程中遇到过大小端的bug。这个是工程中常见但是不易察觉的bug。记得公司有一个团队连续通宵奋战一个月追查一个bug结果就是大小端的问题。所以希望大家引以为戒。什么是大小端Endianness大小端是指多字节数据如int、float等在内存中字节的排列顺序。大端Big-Endian高字节Most Significant Byte, MSB存放在低地址低字节Least Significant Byte, LSB存放在高地址。例如整数0x12345678在内存中按地址递增顺序存储为12 34 56 78。小端Little-Endian低字节LSB存放在低地址高字节MSB存放在高地址。同样0x12345678存储为78 56 34 12。常见平台x86、x86_64 架构通常为小端网络协议如 TCP/IP规定使用大端也叫网络字节序ARM 架构可配置为两种。#include iostream int main() { int num 0x12345678; // 32位整数 unsigned char* firstByte reinterpret_castunsigned char*(num); std::cout Memory bytes (low to high): ; for (size_t i 0; i sizeof(num); i) { std::cout std::hex static_castint(firstByte[i]) ; } std::cout std::dec std::endl; // 恢复十进制输出 if (firstByte[0] 0x78) { std::cout This system is Little-Endian. std::endl; } else if (firstByte[0] 0x12) { std::cout This system is Big-Endian. std::endl; } else { std::cout Unexpected byte order. std::endl; } return 0; }
返回列表