两次补充〜0签署

时间:2016-09-21 04:02:09

标签: c binary twos-complement negation

我是新来的,但我只是想知道如果在二进制补码系统中,那将是0,有符号整数。

它是-1,因为0的翻转是1,但是如果它被签名,答案将是-1?或者答案只是1,只是因为我正在使用带符号的数字并不意味着它会是-1?

2 个答案:

答案 0 :(得分:3)

0是已签名的int(如果您希望它是未签名的,则您需要撰写0U),因此~0也是已签名的int }。

如果您的机器使用二进制补码表示,则其值为-1。绝大多数机器 - 可能是你职业生涯中所见过的所有机器 - 都是2的补充,但从技术上讲,如果你在使用1的补码的机器上使用它,~0可能会调用未定义的行为。有符号整数的表示,也禁止负零。

即使它可能无关紧要,但养成只使用带位运算符的无符号整数类型的习惯是个好主意。

请记住,按位运算符在其操作数上执行“整数提升”,这意味着已签名和未签名的shortchar会自动提升为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