其他分享
首页 > 其他分享> > c – 为什么(18446744073709551615 == -1)是真的?

c – 为什么(18446744073709551615 == -1)是真的?

作者:互联网

当我在使用string :: npos时,我发现了一些东西,我在网上找不到任何解释.

(string::npos == ULONG_MAX)

(string::npos == -1)

是真的.

所以我尝试了这个:

(18446744073709551615 == -1)

这也是事实.

怎么可能?是因为二元对话吗?

解决方法:

18,446,744,073,709,551,615

提到的这个数字,18,446,744,073,709,551,615,实际上是2 ^ 64-1.这里重要的是2 ^ 64-1基本上是基于0的2 ^ 64.无符号整数的第一个数字是0,而不是1.因此,如果最大值为1,则它有两个可能的值:0或1(2).

让我们看看64位二进制中的2 ^ 64 – 1,所有位都打开.

1111111111111111111111111111111111111111111111111111111111111111b

-1

让我们看看64位二进制中的1.

0000000000000000000000000000000000000000000000000000000000000001b

为了使其在One’s Compliment(OCP)中为负,我们将这些位反转.

1111111111111111111111111111111111111111111111111111111111111110b

计算机很少使用OCP,他们使用Two’s Compliment(TCP).要获取TCP,请向OCP添加一个.

1111111111111111111111111111111111111111111111111111111111111110b (-1 in OCP)
+                                                              1b (1)
-----------------------------------------------------------------
1111111111111111111111111111111111111111111111111111111111111111b (-1 in TCP)

“但是,等等”你问,如果在Twos Compliment -1中,

1111111111111111111111111111111111111111111111111111111111111111b

并且,如果在二进制2 ^ 64 – 1中

1111111111111111111111111111111111111111111111111111111111111111b

然后他们是平等的!而且,这就是你所看到的.您将有符号的64位整数与无符号的64位整数进行比较.在C中,这意味着将有符号值转换为无符号,编译器会这样做.

更新

对于技术更正thanks to davmac in the comments,从-1签名到相同大小的无符号类型的转换实际上是在语言中指定的,而不是体系结构的功能.总而言之,您可能会发现上面的答案对于理解支持两个赞美但没有确保您可以依赖的结果的规范的语言/语言非常有用.

标签:c,unsigned,equality,signed,integer-overflow
来源: https://codeday.me/bug/20191006/1860163.html