【问题标题】:Bitwise Not Operator (~ in C) with regards to little endian and big endian关于小端和大端的位非运算符(C 中的 ~)
【发布时间】:2010-11-05 09:18:47
【问题描述】:

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

当在大端机器和小端机器上编译时,我很难理解按位非(C 中的~)会如何影响signed intunsigned int

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

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

我指的运算符是:

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

提前感谢您!

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

【问题讨论】:

  • 您列出的运算符是按位运算符,而不是逻辑运算符。 C中的逻辑运算是&&, ||和!。
  • 按位非运算符确实会影响符号位。但该值不会“变成”无符号。如您所料,〜在有符号整数类型上的结果是,无论有符号值具有通过翻转输入的每一位来计算的位模式。所以负值的~总是非负的,非负值的~总是负的。

标签: c bitwise-operators endianness


【解决方案1】:

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

【讨论】:

  • 对,在您开始通过指针算术/寻址游戏寻址整数的各个字节之前,字节序并不重要。另外仅供参考,列出的运算符不受签名影响,但右移运算符 >> 可以。
  • 所以,~54321 总是会导致 703710 ?
  • 不,位相同,但数值的解释不同。对于有符号二进制补码整数,~n = -n-1。 ~4321 = -4322
【解决方案2】:

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

【讨论】:

  • 是的,我指出依赖于二进制补码算法(据我所知,这在 [human;-)] 一代或更多代的 CPU 中几乎是通用的) 而不是字节序。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2016-12-19
    • 2014-01-11
    相关资源
    最近更新 更多