数据类型的取值范围是怎样算的呢?!
举例就如signed char它的取值范围就是-128~127那它是怎么得到的呢?求解惑,小弟在此先谢过各位啦! 一个字节的表达空间是 256,如果把它作为有符号数,那么,这个空间被一分为二,一半用于表达正值,剩下一半用于表达负值,其中,0 ~ 127(0 ~ 0x7f) 共 128 个数值是正值空间,- 128 ~ - 1 (0x80 ~ 0xff) 的 128 个数值自然就是负值空间了。其实,确定有符号数的边界很好操作
char 0x7f 0x80
short 0x7fff 0x8000
int 0x7fffffff 0x80000000
long long 0x7ffffffffffffffff 0x8000000000000000
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]