在位运算中,endianness对逻辑或移位操作有影响吗?
我正在做有关位运算符的作业,但我无法理解它,我认为我已经陷入了endianness。也就是说,我正在使用小端机器(像大多数机器一样),但这是否需要考虑还是一个浪费的事实?
如果有影响的话,我正在使用C语言。
在位运算中,endianness对逻辑或移位操作有影响吗?
我正在做有关位运算符的作业,但我无法理解它,我认为我已经陷入了endianness。也就是说,我正在使用小端机器(像大多数机器一样),但这是否需要考虑还是一个浪费的事实?
如果有影响的话,我正在使用C语言。
字节序只影响数据在内存中的存储方式。一旦处理器加载数据进行操作,字节序就完全无关紧要了。无论字节序如何,移位、位运算等操作都会按照预期执行(数据逻辑上以低位到高位的方式排列)。
>>
运算符总是将位向最低有效数字位移动。但这并不意味着在使用它们时可以完全忽略字节序,例如,在处理较大结构中的单个字节时,不能总是假定它们会落在相同的位置。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];
澄清一下,我并不完全反对其他答案。我试图强调的是,尽管位运算符本质上是中性的,但在编写代码时不能忽略字节顺序的影响,特别是与其他运算符结合使用时。
正如其他人提到的那样,移位是由C语言规范定义的,并且与字节序无关,但右移的实现可能因架构使用补码算术还是反码算术而有所不同。
这取决于情况。如果不将数字转换为新类型,则可以透明地处理字节序。
但是,如果您的操作涉及一些新类型转换,则需要谨慎使用。
例如,如果您想要右移一些位并显式或隐式地转换为新类型,则字节序很重要!
要测试字节序,您可以将一个int
转换为char
:
int i = 1;
char *ptr;
...
ptr = (char *) &i; //Cast it here
return (*ptr);
{union { int i = 1; char a[4];} b;return b.a[3] == 1;} //大端
- user3139831您没有指定语言,但通常,像C这样的编程语言在位操作中会抽象地处理字节序。因此,在位操作中,字节序并不重要。
128 << 2 == 512
是否成立?”,而第二个问题则是指“在任何CPU上,128 << 2
的布局是否为0x02 0x00
?” - kolen