问:为什么有符号的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函数最后的输出结果是?

 int main(void)
{
char a[];
int i=;
for(i=;i<;i++)
{
a[i]=--i;
}
printf("%d\n",strlen(a));
return ;
}

结果是:255

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

 void foo()
{
unsigned int a=;
int b=-;
(a+b)>?puts(">6"):puts("<=6");
printf("%u\n",a+b);
}

结果是 >6

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

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

    转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...

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

    http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写, ...

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

    在 C 语言中. signed char 类型的范围为 -128~127,每本教科书上也这么写.可是没有哪一本书上(包含老师)也不会给你为什么是 -128~127,这个问题貌似看起来也非常easyea ...

  4. C语言 1字节signed char的范围为什么是-128~127?

    参考 1. 关于 -128 ,+128,-0,+0,-1 的反码补码 | 博客园 2. 八位二进制数为什么表示范围(-128~~+127)理解 | 博客园 无符号单字节范围 无符号单字节unsigne ...

  5. 带符号的char类型取值范围为什么是-128——127

    以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...

  6. char能表示(-128~127)

    char 的取值范围是 -128 ~127 注:数0的补码表示是唯一的: +0的补码=+0的反码=+0的原码=00000000 -0的补码=11111111+1=00000000(mod 2的8次方) ...

  7. 有符号的范围,-128~+127详解(zt)

    这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来 ...

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

    C++中什么经常会运用到char类型,也会将char类型作为循环语句的循环条件,但往往这里最容易出现错误,容易出现溢出,进入死循环.这里我们就来简单介绍下为什么会出现这种情况. 首先,了解下char类 ...

  9. 转:浅谈char类型范围

    在 C 语言中, signed char 类型的范围为 -128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是 -128~127,这个问题貌似看起来也很简单容易, 以 ...

随机推荐

  1. hdoj 1072 Nightmare

    Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  2. jQuery支持mobile的全屏水平横向翻页效果

    这是一款支持移动手机mobile设备的jQuery全屏水平横向翻页效果插件. 该翻页插件能够使页面在水平方向上左右全屏翻动,它支持手机触摸屏,支持使用鼠标滚动页面. 整个页面过渡平滑,效果很不错. 在 ...

  3. java数组使用技巧

    参考网上文章,总结了一下java数组使用技巧,如下: package com.beijing.array; import java.nio.ByteBuffer; import java.util.A ...

  4. 关于TXT转CHM的完整解决方式

    为什么要转CHM? 有些书,TXT的资源非常好找,而CHM的资源非常难找(先不论PDF格式的,只是话说PDF格式的没有一个书签文件夹看起来也非常难受) 而CHM格式在左側有一个文件夹结构,我最喜欢这个 ...

  5. Building Tomcat7 source step by step---官方文档

    Table of Contents Introduction Download a Java Development Kit (JDK) version 6 Install Apache Ant 1. ...

  6. Enable Access Logs in JBoss 7 and tomcat--转

    JBoss 7 is slightly different than earlier version JBoss 5 or 6. The procedure to enable access logs ...

  7. Visual Studio 调试技巧 (二)-- 为中断设置条件

    今天尽是干货.我们来讨论如何为中断设置条件吧. 就像习大大讲的精确扶贫一样,如果我们能很精确地,仅在需要的时候把断点命中,以查看这个时候的程序数据,我们就能显著地提高 Debug 的效率.为断点设置条 ...

  8. Android(java)学习笔记200:Android中View动画之 XML实现 和 代码实现

    1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...

  9. javascript 高级程序设计(三)-数据类型

    ECMAScript 中所有类型的值都有与这两个Boolean值等价的值   数据类型     转换为true的值   转换为false的值 Boolean true   false( String ...

  10. 基于事件的异步模式——BackgroundWorker

    实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWorker组件可以很轻松的实现异步处理,并且该组件还支持事件的取消.进度报告等功能.本文以计 ...