码迷,mamicode.com
首页 > 其他好文 > 详细

关于unsigned char 的范围为-128~127的推导

时间:2015-07-27 15:05:21      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:编程   数据结构   数据   单片机   

对于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就可以多表示一个数字,何乐而不为呢~~~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于unsigned char 的范围为-128~127的推导

标签:编程   数据结构   数据   单片机   

原文地址:http://blog.csdn.net/u010464679/article/details/47082875

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!