关于小端和大端的按位非运算符(〜在C中)
这与家庭作业有关,但这不是家庭作业。
我很难理解,如果在大端机器和小端机器上编译时,按位不是( ~
在C中)会如何影响signed int
和unsigned int
。
字节是否真的 “向后”,如果是,那么按位(和其他运算符)是否会导致根据机器类型产生不同的结果?
虽然我们在这里,对于C中的每个按位运算符,答案是否相同,还是它依赖于它?
我所指的运营商是:
~ /* bitwise Not */ & /* bitwise And */ | /* bitwise Or */ ^ /* bitwise Exclusive-Or */
先感谢您!
更新:到目前为止,在阅读我的回复时,我觉得有必要问一下bitwise not运算符是否会影响signed int
上的符号位。 因为我忘了这一切,所以我担心这部分有点困惑。 亚当似乎在说所有的价值都被视为无符号。 是重新应用符号位还是一次签名的值变为无符号?
按位运算符和逻辑运算符在大端和小端机器中的运行方式相同。 同样,它们也在有符号和无符号数据上操作相同:结果就好像所有内容都是无符号的一样。 所以,如果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)。 它们不关心存储位的顺序,或者如果某些位可能对数据类型有特殊含义,它们只处理所有这些位。 所以这里的字节顺序也无关紧要,因为无论顺序如何,所有位都会受到影响。