关于小端和大端的按位非运算符(〜在C中)
-
10-07-2019 - |
题
这与家庭作业有关,但这不是家庭作业。
我很难理解在大端机器和小端机器上编译时,如果按位(~
在C中)不会影响signed int
和unsigned int
,会有什么不同。
字节是否真的 <!>“;向后<!>”;如果是,那么按位(和其他运算符)会导致根据机器类型生成不同的结果int
?
虽然我们在这里,对于C中的每个按位运算符,答案是否相同,或者它是否依赖于它?
我所指的运营商是:
~ /* bitwise Not */
& /* bitwise And */
| /* bitwise Or */
^ /* bitwise Exclusive-Or */
提前谢谢你!
更新:到目前为止,在阅读我的回复时,我觉得有必要询问按位非运算符是否会影响<=>上的符号位。因为我忘记了所有那些狡猾的事情,所以我担心我在这方面有点困惑。亚当似乎在说所有的价值都被视为无符号。重新应用符号位还是一次签名的值变为无符号?
解决方案
按位运算符和逻辑运算符在大端和小端机器中的运行方式相同。同样,它们也在有符号和无符号数据上运行相同:结果就好像所有内容都是无符号的一样。因此,如果x
和y
是有符号整数,则~x
等于(int)(~((unsigned int)x)
和x & y
等于(int)(((unsigned int)x) & ((unsigned int)y)
,等等所有其他运算符。
其他提示
正如@ Adam的回答所说,由于这些运算符逐位运行,字节顺序并不重要!例如,(~x) == (-x-1)
对于每个signed
整数x
,无论x的长度是多少,并且无论机器的字节顺序如何(只要它使用二进制补码算法 - 是否还有剩下的那个''吨 - ?)
逻辑运算符只关心它们的参数是否为零,它们并不关心这些值是如何在内存中实际表示的。因此对于逻辑运算而言,字节顺序并不重要。
按位运算符总是作用于其参数的所有位,它们分别对不同的位位置产生影响(结果中的位#5仅取决于输入中的位#5)。它们不关心存储位的顺序,或者如果某些位可能对数据类型有特殊含义,它们只处理所有这些位。所以这里的字节顺序也无所谓,因为只要所有位都受到影响,无论它们的顺序如何。