关于小端和大端的位取反运算符(C语言中的~)

4

这与一份作业有关,但不是作业本身。

我很难理解在编译到大端机器和小端机器时,按位取反(C 中的 ~)对有符号整数和无符号整数的影响是否有所不同。

字节是否真的“颠倒了”,如果是这样的话,按位取反(及其他运算符)会导致在不同类型的机器上生成不同的结果。

顺带一提,在 C 中,每个按位运算符的答案都是相同的吗?还是很大程度上取决于具体情况?

我所指的运算符包括:

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

提前感谢您!

更新:在阅读到目前为止我的回答时,我感到有必要问一下按位非运算符是否会影响signed int的符号位。我有点困惑,因为我忘记了所有这些愚蠢的事情。Adam似乎在说所有值都被视为无符号。符号位是否重新应用,还是曾经带符号的值变成了无符号?


1
你列出的运算符是位运算符,而不是逻辑运算符。在C语言中,逻辑运算符是&&、||和!。 - sth
按位非运算符确实会影响符号位。但是值并不会“变成”无符号的。对于有符号整数类型,~ 的结果就是将输入的每个位取反得到的有符号值。因此,负值的 ~ 总是非负的,而非负值的 ~ 总是负的。 - Steve Jessop
3个回答

7

按位运算符和逻辑运算符在大端和小端机器上的操作完全相同。 同样,在有符号和无符号数据上也会产生相同的结果:结果就像所有内容都是无符号的一样。 因此,如果xy是有符号整数,则~x等于(int)(~((unsigned int)x)x&y等于(int)(((unsigned int)x)&((unsigned int)y),对于所有其他运算符也是如此。


2
右侧,字节序在通过指针算术/寻址游戏寻址整数的单个字节之前并不重要。另外,FYI列出的运算符不受有符号性的影响,但是右移运算符 >> 可能会受到影响。 - John Kugelman
那么,~54321总是会得出703710的结果吗? - Frank V
3
不,位数不变,但数值解释会有所不同。使用带符号的二进制补码整数,~n = -n-1。 ~4321 = -4322。 - John Kugelman

2
正如@Adam的答案所述,由于这些操作符逐位进行操作,字节顺序并不重要!例如,对于每个有符号整数x,无论x在字节中占用多少位,以及机器的字节序(只要使用二进制补码算术-是否还有任何未使用二进制补码算术的机器?),都有(~x) == (-x-1)。

是的,我指出依赖于二补数算术(根据我的了解,在人类一代或更长时间内,这种算术已经在 CPU 中普遍应用),而不是字节序。 - Alex Martelli

1
逻辑运算符只关心它们的参数是否为零,而不关心这些值在内存中的实际表示方式。因此,在逻辑操作中,字节序并不重要。
位运算符始终作用于其参数的所有位,并且它们对不同的位位置单独产生影响(结果中的第5位仅取决于输入中的第5位)。它们不关心位的存储顺序或某些位可能对数据类型具有特殊含义,它们只处理所有位。因此,在这里字节序也不重要,因为简单地影响了所有位,无论其顺序如何。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接