2009-06-24 19 views
4

这与作业分配有关,但这不是作业分配。关于小端和大端的按位非操作符(〜C)

我很难理解在大端机器和小端机器上编译时,如果不按比特(~ in C)会影响signed intunsigned int是否有差异。

是字节“向后”,如果不这样的按位不(和其他经营者)引起不同所得int小号根据机器类型来生产?

虽然我们在这里,C中的每个按位运算符的答案都是一样的吗?还是很重要?

我指的是运营商为:

~ /* bitwise Not */ 
& /* bitwise And */ 
| /* bitwise Or */ 
^ /* bitwise Exclusive-Or */ 

预先感谢您!

更新:在阅读我迄今为止的回复时,我不得不问,按位不是否会影响signed int上的符号位。我担心这一部分我有点困惑,因为我忘记了这一切。亚当似乎是说所有的值都被视为无符号的。签名位是否重新应用或者曾经签名的值是否被签名?

+1

您列出的运算符是按位运算符,而不是逻辑运算符。 C中的逻辑运算是&&,||和! – sth 2009-06-24 03:26:37

+0

按位不操作符确实会影响符号位。但是这个值不会“变”为无符号的。正如你所期望的那样,带符号的整数类型的结果是任何有符号的值都具有通过翻转输入的每一位来计算的位模式。因此,负值总是非负的,非负值的总是负值。 – 2009-06-24 18:04:03

回答

7

位运算符和逻辑运算符在大小端机器中的运算都是相同的。同样,它们也在有符号和无符号数据上同样运算:结果就好像一切都是无符号的。因此,如果xy是有符号整数,则~x等于(int)(~((unsigned int)x)x & y等于(int)(((unsigned int)x) & ((unsigned int)y),对于所有其他运营商等等。

+2

直到你开始通过指针算术/寻址游戏寻址一个整数的单个字节时,字节顺序并不重要。此外FYI所列运营商不受签名的影响,但右移运算符`>>`可以。 – 2009-06-24 02:32:33

2

正如@亚当的回答所言,由于这些操作符逐位执行,字节顺序并不重要!例如,每signed整数signed整数x,无论字节的长度是多少,无论机器的字节顺序如何(只要它使用二进制补码算法 - 是否有任何剩下的不是?)

1

逻辑运算符只关心它们的参数是否为零,它们并不关心这些值是如何在内存中实际表示的。所以逻辑操作的字节顺序并不重要。

位运算符始终作用于所有位他们的论据,他们对不同的位位置的影响分别(按位#5的结果只是取决于位#5中输入)。他们不关心位的存储顺序,或者某些位对数据类型可能有特殊的含义,他们只是处理所有位。所以这里endianness也不重要,因为简单地说所有的位都受到影响,不管它们的顺序如何。