关于C语言数据类型的取值范围

我们以V6.0编译器下面的shortint为例子。占2字节。16位。那么值域取值最大正数为0111111111111111那么对应的十进制数为2^15-1.这个我能够理解... 我们以V6.0编译器下面的short int 为例子。占2字节。16位。那么值域取值最大正数为
0111 1111 1111 1111 那么对应的十进制数为2^15-1.这个我能够理解。0就带表符号位嘛。不参与运算。
最大的负数取值我不能够理解了。我理解的是最大的负值取值范围是 1000 0000 0000 0000.这个是补码的话。最高位1是符号位吧。那么我们获取源码就要取反吧。1111 1111 1111 1111在加一个 1 为 1 1000 0000 0000 0000这样就有一个问题。不是16位吗?现在有17位了呀!!我的16位本来就应该把符号位给放进去吧。那么这个范围是-32768 -32767是吗?这不会溢出吧。谢谢!!还是说计算机运算的时候。正数就用原码进行运算。负数就用补码进行运算。。计算机本身不需要进行转换。谢谢!!!!
展开
 我来答
haolizhong4924
2011-10-22 · TA获得超过5217个赞
知道小有建树答主
回答量:600
采纳率:50%
帮助的人:260万
展开全部
补码表示法的特点是:采用“机器加”、“机器减”的算法,可以适用于正负数。
这里“机器加”、“机器减”,就是作二进制加减法的时候,最高位向上的进位略掉,最高位从上面的借位也略掉。也就是说:最高位“进位白进,借位白借”。当然,CPU内部这些进位借位信息并未丢掉,而是留作溢出判断的依据之一。

还有,你上面的叙述有两处笔误:
一处是:
1000 0000 0000 0000取反不是1111 1111 1111 1111,而应是0111 1111 1111 1111。
另一处是:
1111 1111 1111 1111再加一个1,不是1 1000 0000 0000 0000,而是1 0000 0000 0000 0000,按“机器加”丢掉进位是0000 0000 0000 0000。

正确的应该是:机器码32768的机器补码仍然是32768。也就是说1000 0000 0000 0000的机器补码(即你所谓的“取反加1”)仍然是1000 0000 0000 0000。
因为符号位的规定,所以这个机器码代表有符号数只能用来表示负数。所以在有符号整数的运算中,(-32768)乘以(-1)是溢出的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式