一个问题引出的:
请问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的绝对值。