为何C语言中int为0xFFFFFFFF时,值为-1

1、我觉得其中一个比较关键的点是“ 你输入的非十进制的数,就是他的补码,计算机是不用再进行补码转换,直接存入内存。

2、0xFFFFFFFF 如果是一个有符号的数字,因为它的最高位是1,所以这个数是个负数。简单的 在内存中的存储形式为 1111 1111 1111 1111 1111 1111 1111 1111,这个是补码,那么原码是 什么呢?根据规则我们知道将上面的数减去二进制的1,即减去0000 0000 0000 0000 0000 0000  0000 0001,得到 1111 1111 1111 1111 1111 1111 1111 1110,然后按为取反,得到0000 0000 0000 0000 0000 0000 0000 0001,这就是原码----即数字的二进制表示方式,这个数字就是-1了

3、什么是原码、反码、补码?

原码:10进制转换成2进制是原码,只不过正数的原码是本身符号位为0,负数的原码符号位为1(以下篇幅均以单字节为例:10进制1的原码是0000 0001,10进制-1的原码是1000 0001)

反码: 正数的反码是本身,负数的反码是负数的原码0变为1,1变为0   (-1的原码是1000 0001   它的反码就是 1111 1110,)。(注意负数求反码时候的符号位不参与变换)

补码: 正数的补码是本身,负数的补码就是负数的反码加一 (-1的原码是1000 0001   它的反码就是 1111 1110  它的补码就是 1111 1111)

如果是有符号的数据类型,规定最高位(符号位)正数为0,负数为1(规定!!!)

总结:正数的原码,反码 ,补码三值合一, 负数的原码,反码,补码不同。

事实证明计算机中负数是以补码存储的

4、int的最大、最小值

正整数的最大值为 0x7FFFFFFF  也就是十进制的 2147483647

正整数的最小值为 0x00000001 也就是十进制的 1

0表示为:0x00000000 

负整数的最大值为 0xFFFFFFFF 也就是十进制的 -1

负整数的最小值为 0x80000000 也就是十进制的 -2147483648(即 -2^31次方)

参考:

https://blog.csdn.net/littesss/article/details/70495810

https://zhuanlan.zhihu.com/p/103239461

https://blog.csdn.net/is01753/article/details/74912530/

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值