4

这与家庭作业有关,但这不是家庭作业。

我很难理解按位非(~在 C 中)如何影响signed int以及unsigned int在大端机器与小端机器上编译时是否存在差异。

字节是否真的“向后”,如果是这样,按位不(和其他运算符)是否会int根据机器类型产生不同的结果?

当我们这样做时,C 中的每个位运算符的答案是否相同,或者它是否严重依赖?

我指的运营商是:

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

先感谢您!

更新:到目前为止,在阅读我的回复时,我不得不询问按位非运算符是否会影响 a 上的符号位signed int。恐怕我在这部分有点困惑,因为我忘记了所有的寂静。Adam 似乎在声明所有值都被视为无符号。是重新应用符号位还是曾经签名的值变为无符号?

4

3 回答 3

7

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

于 2009-06-24T02:26:36.100 回答
2

正如@Adam 的回答所说,由于这些运算符是逐位进行的,因此字节顺序并不重要!例如,(~x) == (-x-1)对于每个signedinteger x,无论 x 的字节长度如何,并且无论机器的字节顺序如何(只要它使用二进制补码算法 - 是否还有任何不存在的?-)

于 2009-06-24T02:36:27.877 回答
1

逻辑运算符只关心它们的参数是否为零,它们不关心这些值在内存中的实际表示方式。因此,对于逻辑操作,字节序无关紧要。

位运算符始终作用于其参数的所有位,并且它们分别对不同的位位置产生影响(结果中的位 #5 仅取决于输入中的位 #5)。他们不关心位的存储顺序,或者某些位可能对数据类型具有特殊意义,他们只是处理所有这些。所以这里的字节序也无关紧要,因为所有位都会受到影响,无论它们的顺序如何。

于 2009-06-25T00:16:54.150 回答