32位系统中的64位int64_t的字节序问题

5
我想知道,如果类型大于本机字长,并且具有编译器抽象支持,例如在32位系统上的int64_t,内存中的字节顺序是否有任何规范? 例如,在小端机器上,我们应该假设内存布局是完整的64位交换顺序吗?还是可以像PDP-11一样自由选择中间端? 请参见http://en.wikipedia.org/wiki/Endianness#Middle-endian
因为在C99中之前__int64(MS)或long long(gcc)不是标准,所以假设这种类型的字节顺序是否有些牵强?
谢谢

1
C和C ++标准不规定整数内的字节顺序。请查阅您的编译器手册。 - Fred Foo
@larsmans:特别是,它们甚至不能保证类型之间或类型内部的一致性。中间端是绝对允许的。 - MSalters
3个回答

1

为什么标准要规定任何东西在内存中的字节顺序?在所有情况下,这取决于编译器/架构自由决定。如果您对特定架构感兴趣,只需弹出调试器并观察简单程序的行为即可。


因为在编组中,对此进行一些说明是合理的。标准可以说:“基本类型应具有一致的字节顺序布局,根据平台本地支持或内存页设置。”这样,您可以期望64位的布局与32位在同一页(或唯一字节顺序机器上)相同。这将使序列化器(用于网络或二进制保存)的库具有更自然的可移植性。 - v.oddou

0

C语言是一种可移植的语言,因此对于整数类型的实际表示并不做出太多假设。标准甚至允许在值位之间散布填充位!有关更多信息,请参见6.2.6.2 整数类型


1
intN_t类型不允许有填充位。 - Timo
1
@Timo:True 和 long long 是。重点是标准没有规定任何内存布局。 - diapir

0

我认为C标准没有关于字节顺序的规定。这取决于实现。在实践中,我认为int64_t的字节顺序遵循体系结构的字节顺序。因此,即使在32位程序中,int64_t在内存中的存储方式就像它是64位程序一样。但是,由于寄存器是32位的,可能需要两个指令来加载/存储数据。


是的,这就是问题的关键 :) 这种想法似乎很自然,但这只是编译器编写者在编写“大数类型”抽象时遵守的道德准则。而在第一次冲突时,这种考虑将会转向实用性,因为没有规范要求他们这样做。因此我感到担忧。 - v.oddou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接