在big-endian机器中对little-endian整数进行简单的按位操作?

Ale*_*der 4 c binary integer bit-manipulation endianness

为了满足特定的需要,我在四个一个字节的字符中构建一个四字节整数,没有什么特别的(在我的小端平台上):

    return (( v1 << 24) | (v2 << 16) | (v3 << 8) | v4);
Run Code Online (Sandbox Code Playgroud)

我知道,存储在大端机器整数会是什么样子AB BC CD DE,而不是DE CD BC AB小字节序的,但会是完全影响了我的操作,我会被错误地转移,或者它只会导致存储在逆向一个正确的结果需要扭转吗?

我想知道是否要为big-endian机器创建这个函数的第二个版本来进行(但未知)位操作,或者可能使用ntonl相关函数,我不清楚如何知道我的数字是否正确或不.

你有什么建议来确保兼容性,请记住我需要以这种方式形成整数?

AnT*_*AnT 8

只要您在价值水平上工作,无论您的机器是小端还是大端,您获得的结果都绝对没有区别.也就是说,只要你使用语言级的运算符(如|<<在你的例子),你会从任何平台上的上述表达式得到完全相同的算术结果.机器的字节顺序无法检测到,并且在此级别不可见.

当您需要关心字节顺序时,唯一的情况是在对象表示级别检查您正在使用的数据,即在其原始内存表示很重要的情况下.你上面所说的" AB BC CD DE而不是DE CD BC AB"具体是关于数据的原始内存布局.这就是函数的作用ntonl:它们将一个内存布局转换为另一个内存布局.到目前为止,您没有表明实际的原始内存布局对您来说非常重要.是吗?

同样,如果您只关心上述表达式的,则它完全且完全独立于字节序.基本上,当您编写不尝试访问和检查原始内存内容的C程序时,您根本不应该关心字节序.

  • 这样做的原因是因为寄存器通常不被认为是一种字节序或另一种字节序。几乎所有(所有?)体系结构,甚至像 x86 这样的小端体系结构,都将寄存器的最左边位设为 MSB,将最右边设为 LSB(左和右被定义为左移或右移的方向位移动) )。 (2认同)