79

字节顺序与按位运算无关吗?是逻辑的还是转移的?

我正在做有关按位运算符的作业,但我无法对其进行正面或反面,而且我认为我对字节序非常感兴趣。也就是说,我正在使用一个小端机器(就像大多数机器一样),但这是否需要考虑或者这是一个浪费的事实?

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

4

5 回答 5

79

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

于 2009-06-25T00:04:20.570 回答
70

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

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];

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

于 2009-06-25T00:07:53.933 回答
6

正如其他人所提到的,移位由 C 语言规范定义并且与字节顺序无关,但是右移位的实现可能会因架构使用一个补码或二进制补码算法而异。

于 2009-06-25T00:10:20.027 回答
4

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

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

例如,如果您想右移一些位并(显式或不显式地)转换为新类型,字节序很重要!

要测试您的字节顺序,您可以简单地将 aint转换为 a char

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);
于 2012-06-12T18:28:08.530 回答
3

您没有指定一种语言,但通常情况下,诸如 C 之类的编程语言在按位运算中抽象字节序。所以不,在按位运算中并不重要。

于 2009-06-24T23:57:28.667 回答