问:为什么有符号的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. 使用Python扫描端口情况

    #!/usr/bin/python# -*- coding:utf8 -*-# Python:          2.7.8# Platform:        Windows# Authro:    ...

  2. python 分支 循环

    一  python 知识点      1.变量(标签):           a(变量名) = '字符串'or 数字 (整形和浮点型)     a相当于变量名的标签           如: a = ...

  3. Python程序的执行原理(转载)

    Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc  1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...

  4. Nunit中文文档

    NUnit中文文档:http://www.36sign.com/nunit 关于特性的使用:http://www.36sign.com/nunit/attributes.html

  5. [Reactive Programming] Async requests and responses in RxJS

    We will learn how to perform network requests to a backend using RxJS Observables. A example of basi ...

  6. JAVA获取随机数

    在Java中我们能够使用java.util.Random类来产生一个随机数发生器.它有两种形式的构造函数,各自是Random()和Random(long seed).Random()使用当前时间即Sy ...

  7. Qt 学习之路 :信号槽

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  8. [转] 用实例给新手讲解RSA加密算法

    http://www.cfca.com.cn/zhishi/wz-012.htm PS: 通常公钥对数据加密,私钥对数据解密:私钥对数据签名,公钥对数据签名进行认证 RSA加密算法是最常用的非对称加密 ...

  9. Xcode常见报错及解决办法

    报错一: 在iOS7的真机运行时,弹出错误:App installation failed. There was an internal API error. 如图 解决办法: 在Xcode -> ...

  10. eclipse4.3 kepler中安装maven

    1.软件准备 a:Eclipse 4.3 http://www.eclipse.org/downloads/ b:maven http://maven.apache.org/download.cgi ...