为了账号安全,请及时绑定邮箱和手机立即绑定

int难道不是占4个字节么?

然后那个取值范围是怎么计算的呢?

正在回答

7 回答

恩,现在流行的编译器,都是规定的int是四个字节~像tc这样老版的编译器,int才是两个字节,然后也是一样,由于一个字节占八位,最高为符号位,又人为规定,1000000000000000......这个补码编码为-2^31所以,范围就是-2^31~2^31-1

1 回复 有任何疑惑可以回复我~
#1

小池的呆妞 提问者

非常感谢!康萨拉米大~
2015-01-18 回复 有任何疑惑可以回复我~
#2

小池的呆妞 提问者

问问浮点型数据的取值范围又是怎么回事呢
2015-01-18 回复 有任何疑惑可以回复我~
#3

Fiona0126 回复 小池的呆妞 提问者

额。。由于浮点型的存储方式不一样,所以算起来有点复杂~它是参照IEEE754标准的,分为三个部分存储,一个是符号位部分,一个是阶码部分,一个尾数部分,拿float举例,它三部分的占得位数分别是1 8 23,所以我就大概说一下取值是怎么算的,具体你百度查吧,比较长~float的取值就是-2^(2^7-1)*2~2~~~2^(2^7-1)*2
2015-01-18 回复 有任何疑惑可以回复我~
#4

火Rain

——这里关于int(4字节)的取值范围由来(-2^31~2^31-1)我补充一下: 1.一个4字节占8位,所以总共是32位,然后去掉第一位,也即符号位(1:负,0:正),也就剩下31位! 2.所以最小值为:-2^31,最大值为2^31,然后去掉0(0000....0000)也即2^31-1! 3.所以最后得出的范围是:-2^31~2^31-1!(正数的范围不包括0) (注:是这样么,求批评指正!)
2015-02-28 回复 有任何疑惑可以回复我~
#5

Fiona0126 回复 火Rain

不是因为去掉0.。而是它本身的最大值就是2^31-1。而不是你说的2^31。 我们不考虑那么多位,假设只有三位,其中首位为符号位的话,最大值的情况不就是011吗?32位的时候同理啊, 01111111 11111111 11111111 11111111 //而这个数表示的值就是2^31-1.
2015-02-28 回复 有任何疑惑可以回复我~
#6

火Rain 回复 Fiona0126

为什么2^(2^((8-1)-1))*2 我用计算器得到的答案是:3.689349e19? 是这样计算其取值范围的吗?
2015-03-03 回复 有任何疑惑可以回复我~
#7

火Rain 回复 Fiona0126

最大值是(2^31)-1 问题来了,好像是这样啊 那为什么最小值 却是-2^31?不减一?
2015-03-03 回复 有任何疑惑可以回复我~
#8

火Rain 回复 Fiona0126

是不是因为这个二进制补码:二进制补码在计算机中比较常用,当表示负数的时候,在原来原码的基础上再加1
2015-03-03 回复 有任何疑惑可以回复我~
#9

Fiona0126 回复 火Rain

第一个问题,(2^(2^(8-1)-1))*2化简之后其实就是(2^(2^7)) 第二个问题,因为数据是由二进制补码存储的。而正数的补码跟原码相同。而负数则是原码取反+1。。 但是有个100000000{省略若干0}的存在。这个数字在原码中表示的是-0,而00000000{。。。}在原码中表示的是0 但是由于是补码存储的关系。将1000000{。。}取反+1.。又变成了0000000{。。。}。既然这样。。就人为规定了10000{。。。}这个编码为-2^31
2015-03-03 回复 有任何疑惑可以回复我~
#10

火Rain 回复 Fiona0126

感谢!
2015-03-04 回复 有任何疑惑可以回复我~
#11

火Rain 回复 Fiona0126

取反加1 是在最末尾加1,比如 原码10011,反码为11100,补码为11101! 我对第二个问题的答案并不认同!请大大指教下我所作的关于int范围的总结,在回答当中!
2015-03-05 回复 有任何疑惑可以回复我~
查看8条回复

——关于int(4字节)的取值范围由来(-2^31~2^31-1)?
1.【32位】一个字节占8位,所以4字节总共是占32位,然后去掉第一位,也即符号位(1:负,0:正),也就剩下31位!

2.【最大值:2^31-1】为什么不是2^31?

(1)假设只有三位,其中首位为符号位的话,最大值的情况不就是011吗?也即表示3.
3 = 2^(3-1)-1.

(2)32位的时候同理,01111111 11111111 11111111 11111111 //而这个数表示的值就是2^31-1.
2^31-1 = 2^(32-1)-1.

3.【最小值:-2^31】为什么不是-(2^31-1)?

(1)因为数据是由二进制补码存储的:
1)当原码为正数的时候,正数的原码反码补码都相同,即00011的反码也为00011,补码也为00011.
2)当原码为负数的时候,反码即按位取反,比如10011为原码,10011可表示-3,那么符号位不变,其余位按位取反即反码11100.那么10011的补码便是11101.

(2)所以可知int所取的最小值原码为:11111111 11111111 11111111 11111111.
它的反码为:10000000 00000000 00000000 00000000. (在原码中表示-0.)
它的补码为:10000000 00000000 00000000 00000001. (在原码中表示-1.)
依次可以类推-2,-3,-4......-2^31!
【推到-2^31】
其原码为10000000 00000000 00000000 00000001 
其反码为11111111 11111111 11111111 11111110
其补码为11111111 11111111 11111111 11111111
从上可知最小值只能表示到-2^31,而无法表示到更小的一位:-2^31-1!


4.【综上所诉,int(4字节)范围是:-2^31~2^31-1】!

(自己对于这个问题也纠结了很久,得出的结论若有不足之处,敬请批评指正,谢谢!)

0 回复 有任何疑惑可以回复我~


计算机是按二进制方式存储数据的,在计算机中表示整型数据有以下几种方法:        

1.二进制补码:二进制补码在计算机中比较常用,当表示负数的时候,在原来原码的基础上再加1

2.二进制反码:二进制反码是简单地把正数取反就是对应的负数了,比如00000001为1,11111110为-1      

3.偏移表示法: 偏移表示法用一个数与它相减就得到所需的数          

4.带符号的数表示法:最高有效位是符号位,1为负,0为正。比如:00000001为1,10000001为-1


注:正数的原码反码补码都相同,即0011的反码也为0011  

举例来说:对于正数3,其二进制形式为 0011,我们把 0011称为真值,在计算机中用0或1表示正负号,那么 0011在计算机中原码可以表示为00011(第一位为符号位)。反码补码不变。

对于负数,反码即按位取反,比如10011可表示-3,10011为原码,那么符号位不变,其余位按位取反即反码11100.  补码的存在是为了简化计算的,其符号位一起参加运算,从而对于减法可转化为加法。补码的实质就是mod2。比如我们的钟表是mod12的,那么14点钟我们也可以说是下午2点。获得补码的方法是“按位取反,末位加1”那么10011的补码便是11101.。。。。。。。。。。  

机器数即数值在计算机中的表示形式。  

(注:以上是本人查找整理的有关原码、反码和补码的知识,恶补一下自己的储量!若有不足之处,请大大们批评指正,感谢!)

1 回复 有任何疑惑可以回复我~

这个问题,很赞的说,路过学习!

0 回复 有任何疑惑可以回复我~

不是,占2个字节


0 回复 有任何疑惑可以回复我~

学习了 

0 回复 有任何疑惑可以回复我~

2个字节 1字节 = 8bit so。。。。

0 回复 有任何疑惑可以回复我~
#1

小池的呆妞 提问者

char 1个字节float 4个字节double 8个字节int分为long int和short int,其中long int是4个字节,short int是2个字节在vc编译器中int默认是long int,因此int在vc6.0里面是4个字节 我记得我们老师是这样讲的,肿么回事?
2015-01-18 回复 有任何疑惑可以回复我~
#2

dire 回复 小池的呆妞 提问者

这个不是统一规定的 是根据个人的编译器 CPU来规定的 你可以写代码在你的编译器里面判断 你的各个数据类型所占的字节 这个可以百度一下 c语言中的 sizeof()函数
2015-05-22 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C语言入门
  • 参与学习       926207    人
  • 解答问题       20797    个

C语言入门视频教程,带你进入编程世界的必修课-C语言

进入课程

int难道不是占4个字节么?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信