标签:c unsigned equality signed integer-overflow
当我在使用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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。