看到存储在内存中的值来检查字节顺序?

时间:2012-05-04 09:43:25

标签: c

如果我调试这个C代码:

unsigned int i = 0xFF;

如果它是一个小端系统,那么调试器会在内存0x00FF中显示我吗?如果它是一个大端系统,它会显示0xFF00吗?

2 个答案:

答案 0 :(得分:2)

如果你在地址&i附近查看内存的原始内容,那么是的,你就能分辨出来。但是大端的00 00 00 ff和小端的ff 00 00 00,假设sizeof(unsigned int)为4而CHAR_BIT(每个字节的位数)为8 - 你把它们换掉了。

您还可以通过以下几种技巧之一以编程方式检测字节顺序(即,您可以制作一个打印出其运行的体系结构的字节顺序的程序);例如,请参阅Detecting endianness programmatically in a C++ program(解决方案也适用于C)。

答案 1 :(得分:2)

如果:

  • 您的系统有8位char s。
  • 您的系统使用16位unsigned int s
  • 您的调试器将内存显示为十六进制的字节

如果它是小端,你会在&i看到这个:

ff 00 ?? ?? ?? ?? ?? ??

这就是它的大端:

00 ff ?? ?? ?? ?? ?? ??

问号只代表内存中i后面的字节。

请注意:

  • little-endian机器会将最低值的字节存储在最低地址。
  • big-endian机器将在最低地址存储具有最大值的字节。
  • C未指定unsigned int中的位数。这取决于实施。
  • 您可以找到使用CHAR_BIT * sizeof (unsigned int)

如果你的机器使用的是32位unsigned char,你会看到:

ff 00 00 00 ?? ?? ?? ??

在little-endian案例中,在大端机器上你会看到:

00 00 00 ff ?? ?? ?? ??