忧默的小男孩 2022-02-13 23:30 采纳率: 94.4%
浏览 103
已结题

c语言中int的范围为什么是-32768到32767?

一直以来都没搞懂,百度也不懂,希望大神能给我讲讲。假设int分配2个字节,就是16位,第16位表示正负 即1000 0000 0000 0000 第一位可以是0或1 第二位也一样..一直到第15位 所以一共是2的15次方+2的14次方...一直加到2的1次方 共32768, 又因为第一位最小是0,所以0-32767 就是32768个数 (正数我懂) 那么负数呢?不应该也是0到-32767吗? 为什么书上写的是 -32768~32767呢? 不应该是 -32767~32767吗? 负数的第一位,-0等于0啊

  • 写回答

6条回答 默认 最新

  • 当代纠结伦 2022-02-14 03:25
    关注

    int 在内存中以补码的方式存在,且默认是有符号的,计算范围符号位为1的需要要转化为原码(其实都要转换,只不过符号位为0时原反补相同),转换方法减一取反。
    要注意的:
    1000 0000 0000 0001 -1=1000 0000 0000 0000 取反 1111 1111 1111 1111表示为-32767
    1000 0000 0000 0000 -1 在计算机中检测到后不会做这个运算,而是默认为-32768
    如果输入超出这个范围的如:32768
    超出范围时,会以无符号的形式存入,但输出时是以有符号的形式输出
    0111 1111 1111 1111(32767)+1=1000 0000 0000 0000以无符号存入, 输出以有符号形式,转换为原码就是-32768(如上)
    int 是占四个字节,如果要测试的话,用short int(两个字节)
    你的一个问题:1000 0000 0000 0000数值是32768超出范围了,你这样输入的时候就是无符号了。
    还有二进制中是不会有2存在的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月16日
  • 已采纳回答 2月14日
  • 创建了问题 2月13日

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示