c语言中 1是真吗,c – 为什么(18446744073709551615 == -1)是真的?

博客探讨了64位无符号整数的最大值2^64-1与有符号整数在Two's Complement表示法中的差异。解释了在二进制中,如何通过位反转和加1来实现负数,并指出在C语言中,有符号到无符号转换是明确定义的。文章强调了在比较不同类型的整数时要注意的潜在陷阱。
摘要由CSDN通过智能技术生成

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签名到相同大小的无符号类型的转换实际上是在语言中指定的,而不是体系结构的功能.总而言之,您可能会发现上面的答案对于理解支持两个赞美但没有确保您可以依赖的结果的规范的语言/语言非常有用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值