C语言中数据类型数值范围的问题?

[复制链接]
 楼主| myic200610 发表于 2012-2-23 00:53 | 显示全部楼层 |阅读模式
本帖最后由 myic200610 于 2012-2-23 00:58 编辑

C语言中:

char 类型数据数值范围是:-2^7~2^7-1,即-128~127;

unsigned char 类型数据数值范围是:0~2^8-1,即0~255;


signed int 类型数据数值范围是:-2^31~2^31-1,即-2147483648~2147483647;

unsigned int 类型数据数值范围是:0~2^32-1,即0~4294967295。

等等。


我的问题是:char 类型数据数值范围的最小值为什么是-2^7-128),而不是-2^7-1-129)或-2^7+1-127)呢?

我的理解是这样的:

Char类型数据的范围用二进制表示为:

1 111 1111~0 111 1111

其中:

1 111 1111B=-127D

0 111 1111B=127D;

因此,我觉得char 类型数据数值范围的最小值应该是-2^7+1-127),对应的char 类型数据数值范围就应该是是:-2^7+1~2^7-1,即-127~127


请高手指点,我的分析错误在哪里?



谢谢!


王紫豪 发表于 2012-2-23 01:12 | 显示全部楼层
楼主看看补码的定义就知道了, 1 111 1111B 不是最小的,而是最大的负数,最小的应该是 1 000 0000 = -128,为啥正负不对称呢,就是因为没有 ±0
 楼主| myic200610 发表于 2012-2-23 01:25 | 显示全部楼层
本帖最后由 myic200610 于 2012-2-23 01:27 编辑

大侠还没休息呀!
谢谢!研究下补码!

并请教:
你说的没有±0,我的理解是没有-0,只有+0,对吗?
yewuyi 发表于 2012-2-23 09:16 | 显示全部楼层
楼主看看补码的定义就知道了, 1 111 1111B 不是最小的,而是最大的负数,最小的应该是 1 000 0000 = -128,为啥正负不对称呢,就是因为没有 ±0
王紫豪 发表于 2012-2-23 01:12


从数学的理论看,不是没有±0,而是+0=-0,如同一个硬币的正反两面,但用一个硬币表示。

LZ确实是要去看看补码的定义,仔细看看就应该明白了,还不明白的话,就改行从政吧。:lol
yewuyi 发表于 2012-2-23 09:18 | 显示全部楼层
在C语言中,
signed int 类型数据数值范围是:-2^31~2^31-1,即-2147483648~2147483647;
unsigned int 类型数据数值范围是:0~2^32-1,即0~4294967295。


这个与通常的C语言规定也不太符合,一般是2^15
 楼主| myic200610 发表于 2012-2-24 00:05 | 显示全部楼层
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:MyLovelyBaby! INTERNET将影响每个人, 21IC将影响每位电子工程师!

536

主题

2587

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部