转换和字节顺序

时间:2014-02-23 21:42:06

标签: c endianness

表示为32位无符号整数的数字4将是

在大端机器上: 00000000 00000000 00000000 00000100(最重要的字节优先)

在小端机器上: 00000100 00000000 00000000 00000000(最后一个有效字节)

作为8位无符号整数,表示为 两台机器上的00000100。

现在,当将8位uint转换为32位时,我总是认为在大端机器上,这意味着在现有字节前面粘贴24个零,如果机器是小端,则在末尾附加24个零。然而,有人指出,在这两种情况下,零都是前置而不是附加。但这不意味着在一个小端,00000100将成为最重要的字节,这将导致一个非常大的数字?请解释我错在哪里。

3 个答案:

答案 0 :(得分:5)

如果你考虑数学值(它恰好也是big-endian表示),前缀为零。

C中的演员总是努力保持价值,而不是代表。例如,(int)1.25中的1结果(*注释如下)与50 >> 1 == 25中的结果相反,而不是那些没有意义的事情。

正如评论中所讨论的那样,对于位移(以及其他按位操作)也是如此。 (char*)&foo,无论字节顺序如何。

(*注意:通常,取决于float->整数转换的舍入模式)

简而言之: C中的运算符以数学值运算,无论其表示如何。一个例外是当你将指针转换为值时(如{{1}}中所示),从那以后它实际上是对同一数据的不同“视图”。

答案 1 :(得分:4)

不确定它是否回答了您的问题,但会尝试一下:

如果您使用char变量并将其转换为int变量,那么您在两种体系结构上都会得到完全相同的结果:

char c = 0x12;
int  i = (int)c;     // i == 0x12 on both architectures

如果您使用int变量并将其转换为char变量,则会在两种体系结构上得到完全相同的结果(可能会被截断):

int  i = 0x12345678;
char c = (char)i;    // c == 0x78 on both architectures

但是如果你使用int变量并使用char*指针读取它,那么每个架构都会得到不同的结果:

int  i = 0x12345678;
char c = *(char*)&i; // c == 0x12 on BE architecture and 0x78 on LE architecture

上面的示例假定sizeof(int) == 4(某些编译器可能有所不同)。

答案 2 :(得分:0)

松散地说,“ Endianness”是处理器如何查看存储在内存中的数据的属性。这意味着,当将特定数据带入CPU时,所有处理器都将以相同的方式看到它。

例如:

int a = 0x01020304;

存储在寄存器中时,无论字节序大小是多少,无论字节序是大还是小,

当此变量/数据必须存储在"byte addressable"的内存中时,就会出现问题。应该将01(最高有效字节)放入最低内存地址(Big Endian)或最高内存地址(Little Endian)。

在您的特定示例中,显示的是表示形式,即处理器看到它的方式-带有LS / MS字节。


从技术上讲,小型和大型Endian机器都将具有:

  

00000000 00000000 00000000 00000100

在其32位宽的寄存器中。当然,假设您的内存是32位宽的整数,表示44的全部用途是如何存储此endianness