【问题标题】:Why does the byte sequence turn when I cast a char array to an integer array?为什么将 char 数组转换为整数数组时字节序列会发生变化?
【发布时间】:2019-06-27 11:14:42
【问题描述】:

例如:

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。为什么会转?

【问题讨论】:

  • 您可能想了解endianness
  • (int *)a 的行为已经未定义,尤其将其引用为a 可能没有适当对齐,或者至少取消引用会导致严格的别名错误。除此之外,您的目标系统是 little-endian。
  • @Lundin 后跟对齐要求...

标签: c type-conversion


【解决方案1】:

Intel x86 和 AMD64 / x86-64 系列处理器使用 little-endian 格式。 最低有效字节 (LSB) 值位于最低地址。其他字节以重要性的递增顺序跟随。这类似于以十六进制顺序从右到左读取。

每个值中的字节顺序在 little-endian 机器中是颠倒的,如下图所示:

因此,当您编写内存地址增加的字符数组时,您正在逐字节写入不受机器字节序的影响,但是当您尝试将整个 4 字节作为单个整数值读取时,它的倒着读。

请注意,数组中值的顺序不受机器字节序的影响,但仅对单个“多字节值”中的字节进行重新排序。

阅读更多Wikipedia

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2011-08-28
    相关资源
    最近更新 更多