为什么
据我所知,
printf("%d", ~0);
的结果是 -1
?按照逻辑不应该是1
吗?因为 ~ 运算符会将每个1位变成0位,反之亦然。据我所知,
0000
会被转换为1111
。printf("%d", ~0);
的结果是 -1
?按照逻辑不应该是1
吗?因为 ~ 运算符会将每个1位变成0位,反之亦然。0000
会被转换为1111
。~
是按位取反运算符。将00000000
翻转为11111111
。
如果你对1(00000001)
取2's
补码,得到的是11111111
,用于表示二进制中的-1
。
因此输出结果为-1
。
尝试查看其十六进制部分。
printf("%x", ~0);
它将打印ffff
,这意味着它否定了每个位,因此0000000000000000
被转换为1111111111111111
。
根据逻辑,如果第一位是1,则被视为负数。
因此-1
。
~
是按位补码运算符。对于任何可进行按位补码的对象 x
,它将翻转在x
的原始表示中找到的所有二进制位。因此,如果一个整数x
以二进制形式表示为0b00000000
,它将变为0x11111111
。-1
。存在两种表示负数的方式,即一补数和二补数。x
,-x
被表示为x
的按位补码。x
,-x
被表示为加一和x
的按位补码。-0
,事实上,在一补数机器上,您的代码将呈现这种情况。在32位机器上,0
表示为
00000000000000000000000000000000
11111111111111111111111111111111
-1
表示法。%d takes signed integer
different variations of same input
Signed Value ~0 -1
UnSigned Value ~0 4294967295
Hex Value ~0 ffffffff
Hex Value ~0 FFFFFFFF
正如你所看到的,符号位被设置为1,实际上它就是-1的二进制补码
作为一个规则
-ve of n = (~n) + 1;
complement of 5 is -6
and complement(5)+1 is -5
1
代表十进制的-1
。 - kaylum0000
被转换成了1111
。但是你为什么期望二进制的1111
位模式代表1
呢??? - AnT stands with Russia