按位运算符和“字节序”


70

是否字节顺序在所有问题与位操作?任一逻辑或移位?

我正在从事按位运算符的作业,我无法在上面做任何事情,而且我想我对持久性很感兴趣。就是说,我使用的是小端机(就像大多数机器一样),但这是否需要考虑?或者这是一个浪费的事实?

万一重要,我正在使用C。



3
恕我直言,这些是稍有不同的问题。这个问题就像“是否128 << 2 == 512在任何CPU上?”,那个问题就像“是否在任何CPU上128 << 2布局0x02 0x00?”。
kolen

Answers:


76

字节顺序仅对内存中的数据布局很重要。一旦处理器加载了要操作的数据,字节序就完全无关紧要了。无论字节序如何,移位,按位运算等都可以按您期望的方式执行(逻辑上将数据从低位到高位进行布局)。


22
从逻辑上讲应该不是“高到低位”吗?
legends2k 2012年

1
@ legends2k:有同样的想法
gmoniava 2015年

1
@ legends2k:是的。左移=乘以2的幂。右移=除以2的幂(对于负值,舍入与整数除法不同)。
彼得·科德斯

2
@JoshC:不,PDP-10会按照逻辑上在数据上定义的方式执行操作,而不管其存储器/寄存器中的确切位置是哪一位。考虑:当您将两个32位整数相加时,您不必担心处理器必须转换数据才能使相加工作(也不必担心硬件中字节的位顺序)。 ALU只是做“正确的事”,因为它以与其硬件兼容的方式进行了布线。移位的方式相同-它们以抽象硬件的字节/位顺序细节的方式对数据进行操作。
mtraceur '16

1
@JoshC:(续)在C语言中,以更抽象的方式定义位运算符:它们是根据产生的值来定义的,而不是根据它们在底层位周围的移动方式来定义的(因此,如果您使用的是晦涩难懂的平台,在其中硬件位移位指令会产生无效的位布局,例如,您已将值位移位为填充位,则需要合格的编译器来生成可解决该问题的指令,例如我明白了)。
mtraceur

66

按位运算符抽象出字节序。例如,>>操作员总是将位移向最低有效位。但是,这并不意味着您可以放心地完全忽略字节序,例如,在处理较大结构中的单个字节时,您不能总是假定它们将位于同一位置。

需要澄清的是,我与这里的其他答案基本不同。我想强调的一点是,尽管按位运算符本质上是字节序中性的,但您不能忽略代码中字节序的影响,尤其是与其他运算符结合使用时。


1
您基本上不同意所有人,但您的答案被评为最佳。如何识别行为?
Frank V

我添加了一些进一步的说明
1800年9

2
因此,进一步澄清您的意思是,除非我实际上是以字节为单位检索值,否则是否一切正常?
Suvarna Pattayil'Feb 11'15

1
哦>>和<< <<根本不是左移或右移;他们“朝着最不重要的方向转变,并朝着最重要的方向转变”。这使得“通过移位进行除法和乘法”的字节序独立...现在,如果通过memcpy进行转换会搞乱这一点,我会感到困惑。
德米特里(Dmitry)

6

正如其他人提到的那样,移位是由C语言规范定义的,并且与字节序无关,但是右移的实现可能会有所不同,具体取决于体系结构是使用一个补码还是两个补码算术。


4

这取决于。无需将数字转换为新类型,就可以透明地处理字节序。

但是,如果您的操作涉及某些新类型的转换,请谨慎使用。

例如,如果要右移一些位并将其(显式或非强制地)转换为新类型,则字节序很重要!

要测试您的字节序,您可以将int转换为char


…或创建工会…{union { int i = 1; char a[4];} b;return b.a[3] == 1;} //big endian

2

您没有指定语言,但是通常在按位运算中会使用诸如C抽象字节序之类的编程语言。因此,不,按位操作无关紧要。


2
鉴于该问题没有修改,我很惊讶,你说他没有提到的语言,当他做,而且它也标记为C.
西蒙朝圣者

2
@Simeon:我写这个答案的时候还没有。单个作者在很小的时间内所做的编辑将合并为一个。这就是为什么您将其视为单个修订版。
mmx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.