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

问:为什么有符号的char可表示范围是-128~+127?

要明白这个问题,首先要明白一下几点:

  1. 对于char和int计算机中以补码形式存在。
  2. 严格来说计算机就是傻逼,它只知道某个位上是0还是1。
  3. 我们人为告诉计算机一个规则:要是这8个位最高位是0,那么你这8个位中存储的是一个正数;要是这8个位最高位是1,那么你这8个位中存储的就是一个负数。
  4. 我们又告诉计算机一个规则:你这个傻逼,你里面存储的补码是个什么东西,我看不懂,你要人性化一点,把这个东西给我弄成源码,要是用十进制显示出来那最好了,于是你告诉了计算机如何将这8个位上表示的数转化成你想要的结果:如果你这8位存储的是个正数,那么源码和补码是一样的,你把你这8个位中存储的东西按照2进制转化10进制转化就好了,要是你这8位存储的是一个负数,那你需要给这8位数加上1,然后求反,就是源码,再转化成10进制就好了。

当计算机知道了这些规则后就可以完美转化了,那我们看看计算机是如何转化的:

首先计算机中的8位变化范围是:

计算机中的补码    我们转化后的原码    我们从原码得到的十进制数    实际表示的十进制

0000 0000          0000 0000              0                                            0

.....                        ....                           ....                                            ....

0111 1111          0111 1111              127                                        127

1000 0000          1000 0000              128                                       -128

....                         ....                            .....                                          ......

1111 1111           0000 0001              1                                           -1

看到那个128怎么一下变成了-128,还有那个1怎么一下子变成了-1,再回去看看第三条规则就知道,计算机已经知道它这8位里面存储的是一个负数,不要给自己强加那个符号位的概念,那是给计算机的一个识别标志,计算机由这个识别标示知道它里面存储的是正数还是负数,并不影响我们使用这个位上的值,所以我们计算出来的这个128,它是个负的,故由上面的推导可以看出范围是-128到127

关于补码的两个练习题:

问main函数最后的输出结果是?

 1 int main(void)
 2 {
 3     char a[1000];
 4     int i=0;
 5     for(i=0;i<1000;i++)
 6     {
 7         a[i]=-1-i;
 8     }
 9     printf("%d\n",strlen(a));
10     return 0;
11 }

结果是:255

问foo函数输出结果是多少?

1 void foo()
2 {
3     unsigned int a=6;
4     int b=-20;
5     (a+b)>6?puts(">6"):puts("<=6");
6     printf("%u\n",a+b);
7 }

结果是 >6

时间: 2024-08-06 11:51:00

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

[转载]浅析为什么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 的范围为-128~127的推导

对于char型数据,一般会分为无符号和有符号两种类型,这里说明一下这两者的范围问题 首先是无符号char,这个简单, 0000 0000 ~ 1111 1111    范围也就是0 ~ 255 那么对有符号char呢?? 首先清楚一个东西,对于有符号数,最高位为符号位,0为正,1为负 那么按照跟上面一样的思路,范围为: 1111 1111 ~ 0111 1111  也就是-127 ~ 127 可是稍微对微型计算机那本书有认真看过的人都知道,正确范围是-128 ~ 127 这是上面情况~~~ 错了

为何八位有符号整数的范围是-128~127,而不是-127~128

八位的带符号的整数,比如JAVA中的byte,c#中的SByte,为什么值域范围都是-128-127而不是-127~128? 事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,因此8位有符号数的范围是-127~127,它的一个缺点是0是有正负.它用一位表示正负数,然对剩余的位数采用取反. 比如,0111 1111表示127,那-127的则是1000 0000.0000 0000表示正的0,而1111 1111则表示成为负0.因此反码作为有符号的整数并未流行. 现在的计算机中,通常将正数

8位有符号的取值范围是-128~+127

这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来的java,int的聚值范围,再32位计算,-2^31 ~ +2^31-1,可是,却从来没有任何一本教科书或一个老师比我解释过这个问题 原因没有在工作上或者是什么地方直接遇到它,所以我也一直忽略它,但心里总是有一根刺.直到刚才!!!! 就是刚才,无聊之极,在看汇编的书时,又遇到它了,但一如以往,书上

为什么8位符号数表示 -128~127

在这里不得说两样东西.数制和码制. 正数和负数的数制,码制的差异导致.导致了他们表达方式的不同. 但是,这样做是为了达到在二进制之间的运算直接实现正负数的直接的运算. 原码,反码,补码.之间的规则我就不用说了,我想大家都知道. 下面来说一下在补码的表达形式中,各位的意义: -2N-1  2N-2 ~~~ 23 22 21 20 最高位为符号位取的是负数,之后的其他位为正数 现在我们来举一个例子,来验证这个补码的规则: (-5)原码=[1000 0101]=-1(4+1)=-5 (-5)反码=[1

char为什么取值-128——127

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

C++中char类型的溢出问题

C++中什么经常会运用到char类型,也会将char类型作为循环语句的循环条件,但往往这里最容易出现错误,容易出现溢出,进入死循环.这里我们就来简单介绍下为什么会出现这种情况. 首先,了解下char类型的取值范围: char分为无符号(unsigned)和有符号(signed)两种: 无符号(unsigned)的取值范围:0~255: 有符号(signed)的取值范围为:-128~127. 一般我们常用char来声明一个变量,编译器默认为有符号的,即范围为:-128~127. 常见溢出问题: 知