社区
C++ 语言
帖子详情
为什么int型的范围是-32768~32767?这个范围是这么得出来的?
anison
2007-10-21 12:23:50
不少书讲这个问题时不很透彻..
到现在我还一直一知半解的..
只知道int是16位有符号数,怎么得出其表示的范围???
个人的理解:首先看正数,符号为为0,那么最大数的原码应该是:0111,1111,1111,1111即32767
同理最小的负数应该是-32767....
那为什么最小的负数是-32768??怎么得出来的?
谢谢大家
...全文
11137
24
打赏
收藏
为什么int型的范围是-32768~32767?这个范围是这么得出来的?
不少书讲这个问题时不很透彻.. 到现在我还一直一知半解的.. 只知道int是16位有符号数,怎么得出其表示的范围??? 个人的理解:首先看正数,符号为为0,那么最大数的原码应该是:0111,1111,1111,1111即32767 同理最小的负数应该是-32767.... 那为什么最小的负数是-32768??怎么得出来的? 谢谢大家
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
上海伯环自动化
2010-07-01
打赏
举报
回复
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同志说的很清晰,鼓掌
珍惜生命远离CPP
2007-10-21
打赏
举报
回复
补码表示。
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)
关于C语言中有符号的整数值
范围
为什么是从-
32768
~
32767
以及有符号和无符号区别
一、关于C语言中有符号的整数值
范围
为什么是从-
32768
~
32767
对于有符号整
型
,也就是
int
型
,是和编译器的字长有关的,只有在16位编译器上,
int
类
型
占2个字节,其表示
范围
才是-
32768
~
32767
; 对于32位和64位编译器,
int
类
型
占4字节,表示
范围
为-2147483648~2147483647。 以16位编译器为例,介绍其原理,对于32位和64位类似。
int
为有符号整
型
数,在16位编译器上占2字节16位。 对于有符号数,计算机中表达时,最高位约定为符号位,当符号位为0时为正数,符号位为1
为什么16位
int
的取值
范围
是-
32768
~
32767
?
因为有正0和负0之分,负0被充当负数的最小值 为什么
int
的取值
范围
负数比正数多1? 这里记录一下答案。 基础知识: 因为正数在计算机中以原码的形式存在,负数在计算机中以补码的形式存在。 正数:原码=反码=补码 负数:反码=原码除符号位之外的所有位取反 补码=反码+1 因此16位拿出一位做符号位。 正数的最大值就是2的15次方-1(减一是因为从0开始) 按照这个逻辑,负数的最小值是1-2的15次方,但结果不是这样。 这是因为在二进制中,0有两种表示形式。 +0的原码为000
为什么C语言中
int
的表示
范围
是-
32768
~
32767
本文谈论的都为有符号数。 这得从二进制的原码说起: 二进制原码最大为0111111111111111=215-1=
32767
二进制原码最小为1111111111111111=-(215-1)=-
32767
正0和负0:0000000000000000=1000000000000000=0 所以,二进制原码表示时,
范围
是-
32767
~-0和0~
32767
,因为有两个零的存在,所以不同的数
int
为什么是-
32768
到
32767
这得从二进制的原码说起: 如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=
32767
最小为1111111111111111=-2的15次方减1=-
32767
此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0 所以,二进制原码表示时,
范围
是-
32767
~-0和0~
32767
,因为有两个零的存
为什么
int
整
型
(32位)的
范围
是-
32768
到
32767
?
2019独角兽企业重金招聘Python工程师标准>>> ...
C++ 语言
65,193
社区成员
250,524
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章