对于char型数据,一般会分为无符号和有符号两种类型,这里说明一下这两者的范围问题
首先是无符号char,这个简单,
0000 0000 ~ 1111 1111 范围也就是0 ~ 255
那么对有符号char呢??
首先清楚一个东西,对于有符号数,最高位为符号位,0为正,1为负
那么按照跟上面一样的思路,范围为:
1111 1111 ~ 0111 1111 也就是-127 ~ 127
可是稍微对微型计算机那本书有认真看过的人都知道,正确范围是-128 ~ 127
这是上面情况~~~ 错了??
是的,就是错了~~
这里忘记了一个很重要的知识点:计算机中负数都是以补码的形式存储的
那么问题来了,为什么计算机中负数都是以补码的形式存储的呢????
其实简单回答就是为了方便cpu计算,简化电路设计,提高计算效率~~
举个例子:-15
二进制:1000 1111
反码:1111 0000
补码:1111 0001
在计算集中存储的就是1111 0001
再举几个例子:
数字 原码 反码 补码
-1 1000 0001 1111 1110 1111 1111
-2 1000 0010 1111 1101 1111 1110
-3 1000 0011 1111 1100 1111 1101
...
-127 1111 1111 1000 0000 1000 0001
有没有发现规律呢?
发现补码依次递减的,那么-128在-127的基础上再减一,得到什么???
-128 1000 0000 1111 1111 1000 0000
可能你会觉得怎么凭空就多出个-128来了???
问得好!!!
我们把刚才这个表格网上列一点点看看
数字 原码 反码 补码
+1 0000 0001 0000 0001 0000 0001
+0
0000 0000 0000 0000 0000 0000
-0
1000 0000 1111 1111 1000 0000
-1 1000 0001 1111 1110 1111 1111
-2 1000 0010 1111 1101 1111 1110
-3 1000 0011 1111 1100 1111 1101
...
-127 1111 1111 1000 0000 1000 0001
注意看红色部分~~
+0和-0!!!
有什么差别么?...其实没有什么差别。他们在计算时时等同的,但是为什么要有两个呢??
问题真多...
个人感觉这也许就是计算机使用二进制计算的那唯一的一点点小弊端吧~~~
不过前人也是很聪明,对比一下会发现,-128和-0的补码是相同的,也就是说用-128代替了-0
这样做的好处有两点:
1:消除了-0和+0这个地方的重复,节省了空间消耗
2:扩大了有符号char的表示范围-128~127 一共可以表示256,相比-127~127就可以多表示一个数字,何乐而不为呢~~~~
版权声明:本文为博主原创文章,未经博主允许不得转载。