按位运算符和"字节序"

Fra*_*k V 68 c bit-manipulation bit-shift endianness

字节操作,字节顺序是否重要?任一逻辑或移位?

我正在做作业关于位运算符,我不能做出正面或反面就可以了,我想我已经相当挂了字节序.也就是说,我正在使用一个小端机器(像大多数人一样),但是这需要考虑还是浪费的事实?

如果重要,我正在使用C.

Mic*_*ael 70

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

  • 逻辑上不应该是"高到低位"吗? (20认同)
  • @JoshC:不,PDP-10 只会按照它在数据上的逻辑定义来执行操作,而不管哪个位在其内存/寄存器中的确切位置。考虑:当您添加两个 32 位整数时,您不必担心处理器必须转换数据才能使相加工作(您也不必担心硬件中一个字节中的位顺序)- ALU 只是做“正确的事情”,因为它的接线方式与其硬件配合使用。移位的方式相同——它们以抽象出硬件字节/位顺序细节的方式对数据进行操作。 (2认同)

180*_*ION 64

按位运算符抽象出字节序.例如,>>运算符总是将位移向最低有效位.但是,这并不意味着在使用它们时完全忽略字节顺序是安全的,例如,当处理更大结构中的单个字节时,您不能总是假设它们将落在同一位置.

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];
Run Code Online (Sandbox Code Playgroud)

澄清一下,我对这里的其他答案并没有基本的不同意见.我想要强调的是,尽管按位运算符基本上是字节序中性的,但你不能忽略代码中endianess的影响,特别是当与其他运算符结合使用时.

  • 因此,进一步澄清您的意思是,除非我实际上是以字节为单位检索值,否则是否一切正常? (2认同)

rpe*_*ich 5

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