小木心 发表于 2019-5-18 03:10:24

数据类型的取值范围是怎样算的呢?!

举例就如signed char它的取值范围就是-128~127那它是怎么得到的呢?求解惑,小弟在此先谢过各位啦!

jackz007 发表于 2019-5-18 11:08:33

      一个字节的表达空间是 256,如果把它作为有符号数,那么,这个空间被一分为二,一半用于表达正值,剩下一半用于表达负值,其中,0 ~ 127(0 ~ 0x7f) 共 128 个数值是正值空间,- 128 ~ - 1 (0x80 ~ 0xff) 的 128 个数值自然就是负值空间了。
       其实,确定有符号数的边界很好操作
       char            0x7f                      0x80
       short             0x7fff                  0x8000
       int               0x7fffffff                0x80000000
       long long       0x7ffffffffffffffff       0x8000000000000000
      

人造人 发表于 2019-5-18 12:17:22

1根电线可以表示2种状态,2根电线可以表示4种状态,3根电线可以表示8种状态,……

1根电线可以表示2^1=2种状态
    第0根电线
0电线中没有电流
1电线中有电流


2根电线可以表示2^2=4种状态
    第1根电线                  第0根电线
0没有                      0没有                            两根电线中都没有电流
0没有                      1有                              第0根电线中有电流,第1根电线中没有电流
1有                         0没有                           第0根电线中没有电流,第1根电线中有电流
1有                         1有                                 两根电线中都有电流

3根电线可以表示2^3=8种状态

电线2    电线1   电线0
0          0          0
0          0          1
0          1          0
0          1          1
1          0          0
1          0          1
1          1          0
1          1          1

听说char固定为1个字节,8位,signed char表示这8位可以用于表示负数和正数
2^8 = 256
1个字节,8根电线,可以表示出256种变化,256种状态

下面再来说负数

那些科学家们规定,用最高位表示符号位
1根电线不能表示出负数,只能表示0和1

2根电线
电线1    电线0
0          0            最高位电线1为0,正数,电线0为0,这个数是0
0          1            最高位电线1为0,正数,电线0为1,这个数是1
1          0            最高位电线1为1,负数,电线0为0,这个数是-2,没错,这个数表示-2
1          1            最高位电线1为1,负数,电线0为1,这个数是-1

2根电线可以表示 -2,-1,0,1这4个数

按照上面的说法,最高位表示符号位
1 0应该表示 -0,但是为什么这里表示 -2?
因为 -0 = 0,没有必要浪费一个状态,一种变化,没有必要,那时的电线个数可是相当珍贵的
还有一个理由
1 + (-2)= ?

(1) (-2)(-1)
0 1   + 1 0 =1 1

1 + (-2)= -1

如果把1 0 表示 -0,那就不能这样计算,不能按照无符号数计算,有符号数和无符号数需要使用不同的计算规则
如果把1 0 表示 -2,那就不存在这样的问题,无论是有符号数还是无符号数,都用相同的计算规则
这里自行百度,关键词搜索:负数,反码,补码

无符号数
(1)(2)=(3)
0 1 + 1 0 = 11

有符号数
(1) (-2)(-1)
0 1   + 1 0 =1 1
上面说浪费一个状态,一种变化,没有必要,我认为更重要的是因为这个呢,这样导致了相同的运算规则,这很重要,因为计算有符号数时使用无符号数的运算电路就可以了,不需要为了有符号数再创造一个新的电路,省下了元器件,那时的元器件很贵的,但是话说回来,现在的元器件也不便宜吧?^_^,相对于从前,现在要便宜好多了


3根电线
电线2    电线1    电线0
0          0          0               电线2为0,正数,电线1和电线0构成的数是0,这个数是0
0          0          1               电线2为0,正数,电线1和电线0构成的数是1,这个数是1
0          1          0               电线2为0,正数,电线1和电线0构成的数是2,这个数是2
0          1          1               电线2为0,正数,电线1和电线0构成的数是3,这个数是3
1          0          0               电线2为1,负数,电线1和电线0构成的数是0,这个数是-4
1          0          1               电线2为1,负数,电线1和电线0构成的数是1,这个数是-3
1          1          0               电线2为1,负数,电线1和电线0构成的数是2,这个数是-2
1          1          1               电线2为1,负数,电线1和电线0构成的数是3,这个数是-1

3根电线可以表示 -4,-3,-2,-1,0,1,2,3这8个数

电线2为1,负数,电线1和电线0构成的数是0,这个数是-4
电线2为1,负数,电线1和电线0构成的数是1,这个数是-3
电线2为1,负数,电线1和电线0构成的数是2,这个数是-2
电线2为1,负数,电线1和电线0构成的数是3,这个数是-1
你可能不了解这部分,但是事实就是这样的,因为这样计算机中的比较电路也不需要重新构造
这样设计,比较电路同样适用于有符号数和无符号数

无符号数
(7)>(5)
1 1 1 > 1 0 1

有符号数
(-1)> (-3)
1 1 1 > 1 0 1

2^8 = 256,最高位用于表示符号位
2^7 = 128,7根线可以表示128种状态
对于有符号数,正数和负数各用一半,8根线有256种状态,正数用128种状态,负数用128种状态
但是0既不是正数也不是负数,0怎么办?
在我们现在的计算机中,0被划分到正数的那一半,正数有127种状态 + 0这1个状态 + 负数128种状态 = 256种状态

也可以用另一种思维理解这里
8个0就表示0,0就是0

先看3根线,有8种状态
电线2    电线1   电线0
0          0          0            状态1表示数字0
0          0          1            状态2表示数字1
0          1          0            状态3表示数字2
0          1          1            状态4表示数字3
1          0          0            状态5表示数字4
1          0          1            状态6表示数字5
1          1          0            状态7表示数字6
1          1          1            状态8表示数字7


状态8表示数字7
如果有128种状态
状态126表示数字125
状态127表示数字126
状态128表示数字127

signed char范围 -128 ~ 127
-128 ~ 0 ~ 127

页: [1]
查看完整版本: 数据类型的取值范围是怎样算的呢?!