【问题标题】:Does this code check for endianess?此代码是否检查字节顺序?
【发布时间】:2010-08-26 05:53:23
【问题描述】:

我听说在 little endian 中,LSB 位于起始地址,而在 Big endian 中 MSB 位于起始地址。所以我这样写了我的代码。如果不是为什么?

void checkEndianess()
{

int i = 1;
char c = (char)i;

if(c)
        cout<<"Little Endian"<<endl;
else
    cout<<"Big Endian"<<endl;


}

【问题讨论】:

  • 忽略所有这些丑陋的解决方案,变得性感:int i = 1; if (reinterpret_cast&lt;char&amp;&gt;(i)) { /* little */}
  • @GMan: if ( reinterpret_cast&lt;char const&amp;&gt;( (int const&amp;) 1) ) 在 GCC 上工作……
  • @Potato:哎呀,你说得对,我不性感。 if (reinterpret_cast&lt;const char&amp;&gt;(static_cast&lt;const int&amp;&gt;(1)))
  • 不要忘记sizeof(int)&gt;2 有更多的方法来置换存储的字节......在你嘲笑这个想法之前,我曾经使用过一个存储所有整数类型小端的系统,但是floats 以混合顺序存储。

标签: c++ c endianness


【解决方案1】:

不,您正在获取一个 int 并将其转换为一个 char,这是一个高级概念(并且在内部很可能在寄存器中完成)。这与字节序无关,字节序是一个主要与内存有关的概念。

您可能正在寻找这个:

int i = 1;
char c = *(char *) &i;

if (c) {
   cout << "Little endian" << endl;
} else {
   cout << "Big endian" << endl;
}

【讨论】:

  • 非常感谢。你能解释一下“高级概念在这里意味着什么”吗?我也在做同样的事情。当我将它转换为 char 时,我会得到 int 的第一个字节值吗?
  • 高级概念意味着强制转换是 C/C++ 语言的一部分,并且在标准中明确定义,因此在您运行代码的每个可能的平台上结果都是可预测的。 Endianness 是 CPU 的属性,即这是汇编语言的一部分。由于这是依赖于平台的,因此 C/C++ 试图向您隐藏它,因此您不必编写特定于平台的代码。通过写入内存然后从它读取(通过使用指针),您正在做一些更接近硬件的事情,因此可以测试字节顺序。
  • charint 都是整数类型。从intchar 的转换缩小了类型,但具有明确定义的含义,试图保留恰好适合charint 值。这样(char)42 的值仍然是 42...
【解决方案2】:

一种(可以说,当然 ;-P)更简洁的方法来获得对同一内存的不同解释是使用联合:

#include 主函数() { 联盟 { 诠释我; 字符 c; } X; x.i = 1; std::cout

顺便说一句/字节序的变化不仅仅是大的和小的。 :-)

【讨论】:

    【解决方案3】:

    试试这个:

    int i = 1;
    if (*(char *)&i)
        little endian
    else
        big endian
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多