将两个字节的数组转换为单个short的字节序

时间:2009-07-21 01:11:21

标签: casting endianness

问题:我无法理解IBM article摘录中的数字256(2 ^ 8):

  

另一方面,如果是的话   big-endian系统,高字节为1   并且x的值是256。

假设数组中的每个元素消耗4个位,那么处理器应该以某种方式读取:1000 0000.如果它是大端,则为0001 0000,因为字节顺序不会影响字节内的位。 [2]文章中对256的矛盾!?

问题:为什么数字256_dec(= 1000 0000_bin)而不是32_dec(= 0001 0000_bin)?

[2] Endian问题不会影响具有单个字节的序列,因为从存储的角度来看,“byte”被视为原子单元。

3 个答案:

答案 0 :(得分:2)

因为一个字节是8位,而不是4.无符号整数中的第9个最低有效位的值为2 ^(9-1)= 256。 (最不重要的是值2 ^(1-1)= 1)。

来自IBM文章:

unsigned char endian[2] = {1, 0};
short x;

x = *(short *) endian;

他们是正确的;该值在big-endian上为(short)256,在little-endian上为(short)1。

写出这些位,它是{00000001_ {base2},00000000_ {base2}}的数组。 Big endian会解释从左到右读取的位数组;小端将交换两个字节。

答案 1 :(得分:1)

回答你的后续问题:简而言之,大多数编程语言都没有“数组中元素的默认大小”。

在C语言中(可能是最流行的编程语言),数组元素的大小 - 或者其他任何东西 - 实际上取决于它的类型。对于char数组,元素通常 1个字节。但对于其他类型,每个元素的大小都是sizeof()运算符给出的大小。例如,许多C实现给出sizeof(short)== 2,所以如果你创建一个short数组,它将占用2 * N字节的内存,其中N是元素的数量。

许多高级语言甚至不鼓励您尝试发现数组元素需要多少字节。给定一定数量的字节会使设计人员始终使用那么多字节,这有利于透明度和依赖于其二进制表示的代码,但是当出于某种原因改变表示时,后向兼容性很差。

希望有所帮助。 (在我写完第一个版本之后,我才看到其他评论。)

答案 2 :(得分:1)

256 dec 不是1000_0000 bin ,它是0000_0001_0000_0000 bin

使用交换字节(1字节= 8位),这看起来像0000_0000_0000_0001 bin ,即1 dec