简单说一下C语言数据类型取值范围不对称的原因

简单说一下C语言数据类型取值范围不对称的原因

首先是,数字在机器中是以补码形式进行存储的。了解过原码、补码、反码的应该知道,在正数范围内,它们三个是一样的。

因此我们讨论有符号数的补码表示。

举例char类型,该类型的取值范围是[-128,127]。为什么TMax比TMin的绝对值小1呢?

本来char有8个bits,作为有符号类型,除去最高位,还剩7bits,能表示的最大值就是127(111 1111),只考虑这7位的话,负数有[-1,-127],正数有[1,127]可以表示。

然后就可以发现,跟取值范围差距的是0和-128。它们刚好分别是0000 0000和1000 0000。

我们知道,补码表示中,最高位如果是0,就是表示非负数,0是非负数,所以0000 0000表示的是0,而1000 0000怎么看都像是为了利用一下空间,把进位和符号位重叠了……哈哈哈

我的结论就是,本来应该是对称的,但是因为符号数定义的是非负数和负数,所以得把0考虑进去,同时1000 0000也不想浪费,用它表示一下TMin,导致的不对称。

posted @ 2021-01-01 14:53  团叽  阅读(472)  评论(0编辑  收藏  举报