表示为32位无符号整数的数字4将是
在大端机器上: 00000000 00000000 00000000 00000100(最重要的字节优先)
在小端机器上: 00000100 00000000 00000000 00000000(最后一个有效字节)
作为8位无符号整数,表示为 两台机器上的00000100。
现在,当将8位uint转换为32位时,我总是认为在大端机器上,这意味着在现有字节前面粘贴24个零,如果机器是小端,则在末尾附加24个零。然而,有人指出,在这两种情况下,零都是前置而不是附加。但这不意味着在一个小端,00000100将成为最重要的字节,这将导致一个非常大的数字?请解释我错在哪里。
答案 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位宽的整数,表示4
。 4
的全部用途是如何存储此endianness
。