【发布时间】:2017-01-29 03:50:37
【问题描述】:
我是新来的,但我只是想知道如果在二进制补码系统中,~0 会是有符号整数。
它是-1,因为 0 的翻转是 1,但如果它已签名,答案将是 -1?或者答案只是 1 并且仅仅因为我正在使用带符号的数字并不意味着它会是 -1?
【问题讨论】:
-
开始here。
标签: c binary twos-complement negation
我是新来的,但我只是想知道如果在二进制补码系统中,~0 会是有符号整数。
它是-1,因为 0 的翻转是 1,但如果它已签名,答案将是 -1?或者答案只是 1 并且仅仅因为我正在使用带符号的数字并不意味着它会是 -1?
【问题讨论】:
标签: c binary twos-complement negation
0 是一个有符号的int(如果你希望它是无符号的,你可以写成0U),因此~0 也是一个有符号的int。
如果您的机器使用 2 的补码表示,那么它的值将是 -1。绝大多数机器——可能是你在职业生涯中见过的所有机器——都是 2 的补码,但从技术上讲,~0 如果你在使用 1 的补码表示的机器上使用它,可能会调用未定义的行为有符号整数,也禁止负零。
即使这可能无关紧要,养成只使用无符号整数类型和位运算符的习惯也是一个好主意。
请记住,按位运算符对其操作数执行“整数提升”,这意味着有符号和无符号 short 和 char 会自动提升为 int -- 不是 @987654330 @(除非碰巧short 与int 的宽度相同)——因此可能需要显式转换为unsigned。
【讨论】:
~0 不是零的二进制补码。它是 0 的位反转,与一个的补码相同。
如果你想要 C 中的二进制补码,你需要-0(注意减号)
而且,-0 将只是 0。
Proof (in eight bit)
zero - 0b00000000
one'e complement - 0b11111111
Add one - 0b00000001 (ignoring overflow)
-----------
Two's complement - 0b00000000
【讨论】:
~0 是0 的补码。 OP 正在询问 ~0 在二进制补码系统中的十进制值。
-0,那么它实际上是 0 会变得更加清晰。
~0 和0 一样吗?问题不在于-0(负零)的值是多少,而是~0(按位不为零)的值是多少。