int的范围和约定

44 篇文章 1 订阅

一个问题引出的:
请问32位机中int的范围是-32768~32767
而不是-32767~32767
-32768是怎样取到的?


==================================================
消息组:群/校友录()
==================================================
消息类型:聊天记录
==================================================

2005-06-14 10:01:48 刚进幼儿园(404082727)
[:L]昨晚说错了,也没人提示我

2005-06-14 10:02:39 牛肉面()
说错啥了

2005-06-14 10:03:55 刚进幼儿园(404082727)
反码不是那样求的,补码算的自然就错了,那得的结论就不提了
 

2005-06-14 10:04:34 刚进幼儿园(404082727)
你提的问题也有点问题,误导偶门这些小辈啊

2005-06-14 10:06:02 刚进幼儿园(404082727)
不过都怪偶基础不怎么地,才被人欺负啊[:<]

2005-06-14 10:06:05 牛肉面()
(2005-06-13 21:43:05)   刚进幼儿园(404082727)
-32768原码1100 0000 0000 0000
-32768反码0011 1111 1111 1111
-32768补码0100 0000 0000 0000

是这吗?

2005-06-14 10:06:18 刚进幼儿园(404082727)

2005-06-14 10:07:06  hellosam()
-32768补码1000 0000 0000 0000吧?

2005-06-14 10:07:17 牛肉面()
我今天看了资料

2005-06-14 10:08:02 刚进幼儿园(404082727)
我查啦查书那int有个范围是-32768~32767

2005-06-14 10:08:16 刚进幼儿园(404082727)
所以你误导俺们了

2005-06-14 10:08:35 刚进幼儿园(404082727)
我算得也一塌湖度

2005-06-14 10:08:57 刚进幼儿园(404082727)
不好意思啊

2005-06-14 10:09:31 牛肉面(215631428)
我问:
请问32位机中int的范围是-32768~32767
而不是-32767~32767
-32768是怎样取到的?  
 

2005-06-14 10:09:45  hellosam()
其实就是-0

2005-06-14 10:09:54  hellosam()
但是-0时没有意义的

2005-06-14 10:10:05  hellosam()
就用来表示-32768了

2005-06-14 10:10:28  hellosam(0)
补码的范围比原码多一个

2005-06-14 10:10:42  hellosam()
就是-0那里移下来的

2005-06-14 10:18:09 刚进幼儿园(404082727)
原码最小数1111 1111 1111 1111
反码      1000 0000 0000 0000
补码      1000 0000 0000 0001
这个数应该是:
那好了补码最小数是:
          1000 0000 0000 0000

2005-06-14 10:21:39 刚进幼儿园(404082727)
说错拉,还希望见到拉说出来挖

2005-06-14 10:24:11 刚进幼儿园(404082727)
怎么看这个数怪怪的!

2005-06-14 10:24:27 刚进幼儿园(404082727)
不知道是怎么算得-2^15
 

2005-06-14 10:28:00 刚进幼儿园(404082727)
32768~32767(不是32768)是16位编译器(如Turbo C2.0)的范围。

2005-06-14 10:29:04 刚进幼儿园(404082727)
和机器位没多大关系(表面上看是吧),多和编译器实现有关,

2005-06-14 10:29:28  hellosam(57532790)
嗯,现在都是32位机器了

2005-06-14 10:30:48 刚进幼儿园(404082727)
c/c++中有个头文件limit.h/climit.h中有定义整形范围的

2005-06-14 10:31:21 刚进幼儿园(404082727)
你要是感兴趣打开看看,

2005-06-14 10:31:52 刚进幼儿园(404082727)
也可用sizeof看看

2005-06-14 10:32:08 牛肉面(215631428)
哦,看看

2005-06-14 10:32:15  hellosam()
可以看是几个字节的

2005-06-14 10:32:53 刚进幼儿园(404082727)
几个字节定啦范围也就定拉

2005-06-14 10:33:42 刚进幼儿园(404082727)
MIN_INT是最小数宏!
 


开始总结:

2005-06-14 10:34:55 刚进幼儿园(404082727)
R&K C没有确切定义数值型的长度和精度。只是规定了:Short不能比Integer长,Integer不能比Long长。因此,取决于不同的平台、不同的C编译器

2005-06-14 11:02:44 刚进幼儿园(404082727)
补充: ANSI C标准规定了每种整数类型的最小值域(但没有规定它们必须采用哪种编码方案),并要求所有的C语言实现都要在limits.h头文件中通过诸如INT_MIN、INT_MAX这样的宏来指定该实现中整型数据的实际值域,而且这些实际的值域一定不能比标准规定的最小值域还要小(也即要求每种实现在limits.h中定义的宏的绝对值不小于C标准规定的同名宏的绝对值,并且符号要保持一致)。标准定义的INT_MIN是-(2^15 - 1),INT_MAX是(2^15 - 1),换句话说,标准保证了int型数据至少能表示-(2^15 - 1)到(2^15 - 1)这样一个对称区间内的所有整数,因此程序员可以放心大胆地用int变量存储以上范围内的任何整数。但与此同时请特别注意,用int变量表达超出上述范围的数将是一件没有法律(标准即是程序员的法律)保障的事情,所以不应该想当然地认为-32768(即-2^15)一定可以用int型来表达,尽管它确实位于用二次补码记法(twos-complement notation)进行编码的16位整数的值域内。

2005-06-14 11:16:14 刚进幼儿园(404082727)
注意,机器相关类型的最终解释是由“编译器”决定的。所以,整形长整形倒底是多长,是由你的编译器而不是机器决定的。tc就是这样规定的吧,int就是int16,long是int32

其他相关:

2005-06-14 11:20:23 刚进幼儿园(404082727)
当为INT_MIN(32位的int此值为0x80000000,即–2147483648)时,对它取负会产生上溢,因为32位的int能表示的最大正数是INT_MAX(0x7fffffff,即2147483647)。实际上,对INT_MIN取负等于什么也没有干(0x80000000按照补码取负规则还是0x80000000)。因为函数声明的返回值也是int,

2005-06-14 11:21:05 刚进幼儿园(404082727)
简单的解决办法就是用unsigned int类型的变量来接收返回值。因为32位的unsigned int的值域范围是0到4294967295(0xffffffff),2147483648落在这个范围内,所以用unsigned int变量可以正确地表达INT_MIN的绝对值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值