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

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

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

时间: 2024-11-10 08:18:23

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

char为什么取值-128——127

所以当char 类型的变量取值超过这个范围时,会发生截断. 例:char a=128 00000000 00000000 00000000 10000000 发生截断后取低8位为 10000000,即表示的是-128: 同样:char b=-130;截断后表示的是126.

解读为什么有符号的char可表示范围是-128~+127

问:为什么有符号的char可表示范围是-128~+127? 要明白这个问题,首先要明白一下几点: 对于char和int计算机中以补码形式存在. 严格来说计算机就是傻逼,它只知道某个位上是0还是1. 我们人为告诉计算机一个规则:要是这8个位最高位是0,那么你这8个位中存储的是一个正数:要是这8个位最高位是1,那么你这8个位中存储的就是一个负数. 我们又告诉计算机一个规则:你这个傻逼,你里面存储的补码是个什么东西,我看不懂,你要人性化一点,把这个东西给我弄成源码,要是用十进制显示出来那最好了,于是你

[转载]浅析为什么char类型的范围是 —128~+127

http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗:  -2^(n-1)~2^(n-1)-1   n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -1 即    -2

浅析为什么 char 类型的范围是 : 128~+127

在 C 语言中, signed char 类型的范围为 -128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是 -128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗:  -2^(n-1)~2^(n-1)-1 (n为整型的内存占用位数),所以 int 类型32位那么就是 -(2^31) ~ 2^31-1 即 -2147483648~2147483647,但是为什么最小负数绝对值总比最大正数多 1 ,这个问题甚至有的

浅析为什么char类型的范围是 —128~+127

在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用去思考为什么,不是有一个整型范围的公式吗:  -2^(n-1)~2^(n-1)-1   n为整型的内存占用位数,所以int类型32位 那么就是 -(2^31)~2^31 -1 即    -2147483648~2147483647,但是为什么最小负数绝对值总比最大正数多1 ,这个问题甚至有的工作几年

图像处理中像素点的问题:unsigned char 和 char

以前在做图像处理的时候,一直不太在意这个问题,对图像每个像素点的灰度值,总是认为char也可,unsigned char也可.尽管它们都是8位,但是表示的数的范围却不相同:char: -128~127, unsigned char: 0~255.很明显,unsigned char才是正确的选择. 你可以这样定义: 1 struct { 2     char r; 3     char g; 4     char b; 5 }pixel_t; 6 也可以这样定义: 8 struct { 9    

char 与 unsigned char之间的坑

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢? 主要是符号位,但是在普通的赋值,读写

char、signed char、unsigned char的区别

ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char char相当于signed char或者unsigned char,但是这取决于编译器! 这三种字符类型都是按照1个字节存储的,可以保存256个不同的值. 不同的是取值范围signed char取值范围是 -128 到 127unsigned char 取值范围是 0 到 255 signed char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,

char与unsigned char 区别

char 与 unsigned char的本质区别 http://bbs.csdn.net/topics/270080484 同一个内存内容:10010000 你用char*   解释是-112 你用unsigned   char*   解释是144 还是同样这个内存内容赋给整型值,用unsigned   char   类型还是会得到144,用char类型的就会是负数. 真正的差别还是取决于你的程序.某些情况这两种类型表示都行. 补充一下: char 可能是signed char,也可能是uns