c - 为什么将 char 数组转换为整数数组时字节序列会发生变化?
问题描述
例如:
int main(int argc, char* argv[]){
char a[4]={0,0,0,1};
int *ia=(int *)a;
printf("%d",ia[0]);
}
它打印 16777216 因为它是二进制的 00000001 00000000 00000000 00000000 。为什么会转?
解决方案
Intel x86 和 AMD64 / x86-64 系列处理器使用 little-endian 格式。最低有效字节 (LSB) 值位于最低地址。其他字节以重要性的递增顺序跟随。这类似于以十六进制顺序从右到左读取。
在 little-endian 机器中,每个值中的字节顺序是颠倒的,如下图所示:
因此,当您编写内存地址增加的字符数组时,您正在逐字节写入,不受机器字节序的影响,但是当您尝试将整个 4 字节作为单个整数值读取时,它会向后读取。
请注意,数组中值的顺序不受机器字节序的影响,但仅对单个“多字节值”中的字节进行重新排序。
在维基百科上阅读更多
推荐阅读
- perl - Perl WebService 使用 HTTP::Server::Simple::CGI 增加最大连接数
- php - Chart.js - 如果没有值显示 0
- python - 远程 kubectl 命令在 python 中不起作用
- python - 分组上的熊猫分工保留剩余部分
- vega-lite - Vega Lite Javascript API 的分面问题
- regex - 我可以用 perl 替换输入映射文件中列出的正则表达式来修改输入 csv 吗?
- angular - 使用 Angular Ivy 构建 SSR 的 Flex Layout 编译错误
- angular - 带有 Angular 的 html2canvas [解析 CSS 组件值时出错,意外的 EOF html2canvas]
- parallel-processing - 使用 doParallel 的栅格合并为每个合并步骤创建临时文件
- angular - Angulars 动画参数是什么?