为什么int型的范围是-32768~32767?这个范围是这么得出来的?

anison 2007-10-21 12:23:50
不少书讲这个问题时不很透彻..
到现在我还一直一知半解的..

只知道int是16位有符号数,怎么得出其表示的范围???

个人的理解:首先看正数,符号为为0,那么最大数的原码应该是:0111,1111,1111,1111即32767
同理最小的负数应该是-32767....
那为什么最小的负数是-32768??怎么得出来的?

谢谢大家
...全文
11137 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
11楼说的最清楚了
nuoyantaizi 2008-10-15
  • 打赏
  • 举报
回复 1
朋友,你这个问题我了探讨过,现在我给你说一下,可能不太清楚,你好好看.
int型规定只能存放16位的数据,而且是以补码形式存放的.这点我们先不看,我们看16位能放多大的数:11111111,11111111.这是16位二进制最大的数.那么它的反码和补码是一样的(正数的正反码一样.)但是,它的最高位是1被系统认为是负数,所以最高位应该是0.那么int型最大的数就是:01111111,11111111.就是2的15次方减1,这个你该懂吧?
看负数.我们来看int型最小的负数(二进制原码):-11111111,11111111对不对?前面的减号是我本人要告诉你这个数是负数.它的补码是:先,取反:00000000,00000000.再加1:00000000,00000001.系统认为是正数,所以不对!
那么我们以补码来看一个负数:11111111,11111111(补码)那么它的原码就是:00000000,00000001.就是-1(早就声明了这个数是负数).所以不是最小的负数.如果一个负数的补码是:11111111,11111110.它的原码就是00000000,0000010.这个数是-2.如果一个负数的补码是:11111111,11111101.它的原码就是:00000000,00000011.也就是-3.可想而知,当一个负数的补码是10000000,00000000.那么它的原码就是int型最小的负数!至于最前面的1为什么不减,你想想也该知道,如果减了,这个数的还是负数吗?那我们再减1,这个数的码补就是:01111111,11111111.系统会认为是正数,它的原码和补码是一个样的,不就是正32767了吗?
好了,你懂了吗?不懂加我QQ396747973再给你讲!
Alex5111985 2008-02-21
  • 打赏
  • 举报
回复
学习从基础开始:)
anison 2007-10-28
  • 打赏
  • 举报
回复
还是有点迷糊...

hkk333
日帝★皇都
等 级:
hkk333(日帝★皇都) ()发表于:2007-10-22 23:20:2416楼 得分:4
int一般是32位,-2^32就是最小负数,2^32-1就是最大正数
考虑8位情况00----ff(hex),也就是00000000(10进制0)----11111111(bin) <10进制255 >
它一共能直接表示的数值个数是2^8=256个,非负数:0-127(ff hex) <128个 >,负数-1~-128 <128个 >
于是8位的范围就是-128~127 (-128,-127....-1,0,1,2,....127 <total 256 >)
注意01111111,这是8位中最大正数,0是符号位,那么显然能表示的最大正数是7F(hex)=127,还有一个0,剩下的就是负数,
256-1-127=128个,就是-1~-128

同理,n位整型范围是-2^n~~~2^n-1

罗嗦了点,同样建议楼主还是好好看基础书吧
----
这个比较好懂..谢谢大家
zhongguoren666 2007-10-23
  • 打赏
  • 举报
回复
这是二进制补码来算的.不是人为定义 的.
星光伴月 2007-10-23
  • 打赏
  • 举报
回复
汗:错了,太错了:

int数据类型在32位机器中多数是用32位二进制表示的,而2的32次方就是4294967296,即它最多能表示4294967296个不同的数,第一位表示符号之后,就只能表示一半的数了.
如果是64位机器,int数据类型可能是64位的(这由编译器决定),就可以表示多达18446744073709551615个不同的数了,即可以表示有符号数的范围是:
-9223372036854775808 ~ 9223372036854775807 够大吧?
星光伴月 2007-10-23
  • 打赏
  • 举报
回复 1
int数据类型在32位机器中多数是用32位二进制表示的,而2的32次方就是65536,即它最多能表示65536个不同的数,第一位表示符号之后,就只能表示一半的数了.
如果是64位机器,int数据类型可能是64位的(这由编译器决定),就可以表示多达4294967296个不同的数了,即可以表示有符号数的范围是:
-2147483648 ~ 2147483647
hkk333 2007-10-22
  • 打赏
  • 举报
回复
这个论坛不能编辑?
上面打错了一个字: 非负数:0-127(7f hex)
hkk333 2007-10-22
  • 打赏
  • 举报
回复
int一般是32位,-2^32就是最小负数,2^32-1就是最大正数
考虑8位情况00----ff(hex),也就是00000000(10进制0)----11111111(bin)<10进制255>
它一共能直接表示的数值个数是2^8=256个,非负数:0-127(ff hex)<128个>,负数-1~-128<128个>
于是8位的范围就是-128~127 (-128,-127....-1,0,1,2,....127 <total 256>)
注意01111111,这是8位中最大正数,0是符号位,那么显然能表示的最大正数是7F(hex)=127,还有一个0,剩下的就是负数,
256-1-127=128个,就是-1~-128

同理,n位整型范围是-2^n~~~2^n-1

罗嗦了点,同样建议楼主还是好好看基础书吧
anison 2007-10-22
  • 打赏
  • 举报
回复
...收获良多,还有一点不明白:以上各位都在知道负边界值是-32768的情况下讨论的
如果现在不知道任何结论,怎么推断int型能表示的最小负数啊..?

可能我真的太啰嗦.但我想把这个问题彻底弄清楚~~谢谢各位
anison 2007-10-22
  • 打赏
  • 举报
回复
...收获良多,还有一点不明白:以上各位都在知道负边界值是-32768的情况下讨论的
如果现在不知道任何结论,这么推断int型能表示的最小负数啊..?

可能我真的太啰嗦.但我想吧这个问题弄清楚
freshui 2007-10-22
  • 打赏
  • 举报
回复
这是16位机器上的int范围 -2^15 < i <2^15-1
32位机器是 -2^31 < i <2^31-1
星光伴月 2007-10-22
  • 打赏
  • 举报
回复
用二进制补码表示数的时候,除符号位之外,其它位全为0时,应该都表示0,所以,补码就有+0与-0之说,如果就按照这样表示的话,那么,计算机处理的数的范围(16位)就是: -32767~+32767,并且,0有两个,即+0和-0,有两个0,对计算机来说,不好处理.为了更好的处理这些数,就必须让其中一个0不再表示0,使0有惟一表示.根据符号位的定义,-0的符号位为1,应该表示负数更为合理,所以就规定,表示-32768.
这么说应该好理解一些了吧?
higter 2007-10-22
  • 打赏
  • 举报
回复
他可能问的是这个范围怎么算的。
这个和计算机的字长有关,现在一般都32位机,字长就是32位,也有大量用64位CPU的,字长就是64
panlong1987 2007-10-22
  • 打赏
  • 举报
回复
内存里都是二进制表示,而且都是用补码来表示的,每一个数的最高位是符号位,0表示正数,1表示负数,对于补码,正数的补码是本身,负数的补码是原码按位取反,然后加一,这样的话,正数的32678用二进制表示成10000000,00000000,这时最高位是一,所以认为是负数,所以代表-0而不是+32678,这样的话有两个0,那么正数也自然少一个了~~不知说的清不清楚
linking3000 2007-10-22
  • 打赏
  • 举报
回复
panlong1987和Turntogo同志说的很清晰,鼓掌
  • 打赏
  • 举报
回复
补码表示。
geggegeda 2007-10-21
  • 打赏
  • 举报
回复
你这样吧,你先看看char 型的表示范围,他是从-128~127
正好255个数字,正好一个字节
你得弄清楚几个概念,二进制,十进制,他们之间怎么转换的
再弄明白什么是二进制原码,补码表示,你到网上到处都是,你找的那个就是补码的

用补码的原因就是计算机可以把减法当加法算.


PcrazyC 2007-10-21
  • 打赏
  • 举报
回复
你去看看原码,补码的资料吧,计算机里储存的都是以补码形式存在的,假设INT是16位的,10^16(最高位是1,其它位是0)正好是负数
-10^16的补码形式,而正数最大只能是10^16-1(最高位是0,其它位是1,正数补码与原码相同)
panlong1987 2007-10-21
  • 打赏
  • 举报
回复
在内存里都是用补码来表示的,所以要看补码的形式,对于0要特殊考虑
加载更多回复(4)

65,193

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧