我是新来的,但我只是想知道如果在二进制补码系统中,那将是0,有符号整数。
它是-1,因为0的翻转是1,但是如果它被签名,答案将是-1?或者答案只是1,只是因为我正在使用带符号的数字并不意味着它会是-1?
答案 0 :(得分:3)
0
是已签名的int
(如果您希望它是未签名的,则您需要撰写0U
),因此~0
也是已签名的int
}。
如果您的机器使用二进制补码表示,则其值为-1。绝大多数机器 - 可能是你职业生涯中所见过的所有机器 - 都是2的补充,但从技术上讲,如果你在使用1的补码的机器上使用它,~0
可能会调用未定义的行为。有符号整数的表示,也禁止负零。
即使它可能无关紧要,但养成只使用带位运算符的无符号整数类型的习惯是个好主意。
请记住,按位运算符在其操作数上执行“整数提升”,这意味着已签名和未签名的short
和char
会自动提升为int
- 而不是 unsigned int
(除非short
的宽度与int
的宽度相同) - 因此可能需要明确转换为unsigned
。
答案 1 :(得分:-1)
~0
不是零的两个补码。它是0的位反转,与1的补码相同。
如果你想要C中的两个补码,你需要-0
(注意减号)
并且,-0
只是0。
Proof (in eight bit)
zero - 0b00000000
one'e complement - 0b11111111
Add one - 0b00000001 (ignoring overflow)
-----------
Two's complement - 0b00000000