参考

1. 关于 -128 ,+128,-0,+0,-1 的反码补码 | 博客园

2. 八位二进制数为什么表示范围(-128~~+127)理解 | 博客园

无符号单字节范围

无符号单字节unsigned char位宽是8bit,范围[0, 1111 1111b],也就是[0, 255]。

有符号单字节范围

有符号单字节signed char位宽也是8bit,绝对值范围也是[0, 1111 1111b],不过最高位表示符号位,能表示的范围是多少呢?

不得不考虑一个特殊情况,0加符号位可表示+0,-0。而在早期计算机存储不够时,用2个不同的补码(±0)表示数学上的同一个0,是一种浪费,故规定-0表示为-128。

这样,[-127, 127](补码:[1000 0001b, 0111 1111b])就没有争议。

我们知道,

-128 = -127 - 1,那么,补码=1000 0001b - 1b = 1000 0000b ,最高位1,符号位未变;

128 = 127 + 1,那么,有两种情况

1)反码+1到补码符号位改变,补码=0111 1111b + 1b = 1000 0000b,最高位1,与-128补码相同。

2)反码+1到补码符号位不可变,补码=0111 1111b + 1b = 0000 0000b, 最高位为0,与+0补码相同。 (不符合溢出特点,因为+0不是最小的数,最大的数溢出后一般成为最小的数,舍)

由此,+128(若存在)及-128的补码,和-0原码是一样的。

那么,-128在计算机中实际上是如何用单字节存储的?

下面做实验验证,思路:用单字节signed char存储,然后直接debug查看存储的二进制值。

(调试环境:IDE Eclipse Photon,编译器:Cygwin GCC)

#include <stdio.h>

int main()
{
signed char a = -128;
signed char a2= -127;
signed char a3 = 128; int na = sizeof(a);
int na2 = sizeof(a2);
int na3 = sizeof(a2); printf("a=%d , size=%d\n", a, na);
printf("a2=%d , size=%d\n", a2, na2);
printf("a3=%d , size=%d\n", a3, na3); a --;
a2 --;
a3 ++;
printf("a=%d , size=%d\n", a, na);
printf("a2=%d , size=%d\n", a2, na2);
printf("a3=%d , size=%d\n", a3, na3);
return 0;
}

可以发现,

a=-128 (Decimal)= 1000 0000 (Binary)

a=-127 (Decimal)= 1000 0001 (Binary)

a=+128 (Decimal),但计算机存储值=-128(Decimal)=1000 0000 (Binary)

a, a2, a3自减1后,

a = 0111 1111(Binary) = 127 (Decimal)

a2 = 1000 0000(Binary) = -128(Decimal)

a3 = -127(Decimal)

对应Console输出

小结

1. 计算机中,C语言有符号单字节表示范围[-128, 127]

2. 无法直接存储128,会转换为-128

C语言 1字节signed 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. 解读为什么有符号的char可表示范围是-128~+127

    问:为什么有符号的char可表示范围是-128~+127? 要明白这个问题,首先要明白一下几点: 对于char和int计算机中以补码形式存在. 严格来说计算机就是傻逼,它只知道某个位上是0还是1. 我 ...

  5. Byte 一个字节的数据大小范围为什么是-128~127

    一个字节是8位,最高位是符号位,最高位为0则是正数.最高位为1则是负数 如果一个数是正数,最大数则为:01111111,转为十进制为127, 如果一个数是负数,按照一般人都会觉得是11111111,转 ...

  6. char、signed char 和 unsigned char 的区别

    ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.而不是像short.int一样只有两种(int默认就是signed int). 三者都占1个字节( ...

  7. char , unsigned char 和 signed char 区别

    ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.char相当于signed char或者unsigned char,但是这取决于编译器!这三种字符 ...

  8. c语言数据类型字节长度

    突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度.google各种查找,各种书籍:<C++ Primer>.<C程序设计语言>查看,终于明 ...

  9. C 中 char、signed char 和 unsigned char 的区别

    C 中 char.signed char 和 unsigned char 的区别 来源:http://bbs.chinaunix.net/thread-889260-1-1.html 参考:https ...

随机推荐

  1. vue中的金额格式0.00 和 后台返回时间格式带T调整正常格式

    <template> <div class="consumption"> <p>{{payTime|Time}}</p> <p ...

  2. [远古回忆]发现了以前的一些wow截图 这里也备份一下

    看邮箱里面通知 网易相册24号就停服了..赶紧找到以前的账号登录了进去瞅瞅 看看有什么重要的东西需要备份的 想不到发现了很多惊喜 虽然因为年代久远和网易相册提供的免费服务 很多文件图片和其他资料有接近 ...

  3. Springboot项目创建文件中相对路径问题

    Springboot项目创建文件中相对路径问题 原代码: String location = "./src/main/resources/UsersFiles/" + userId ...

  4. Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用

    问题:在哪里都能执行java命令,是和JAVA_HOME变量有关系呢还是path中指定的那个java路径呢?? 刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME.Path.CLASS ...

  5. js和jsp中怎么去获取后台 model.addAttribute()存入的list<。。。>对象

    java 后台List productionGroupList =getProductionGroupList(); model.addAttribute("productionGroupL ...

  6. 输入与输出 Perl 第五章

    1. chmop($line=<STDIN>) ;  #读取下一行,截掉换行符. 2. while(defined($line=<STDIN>) { print " ...

  7. mvc 部分页

    在一些复杂的项目中,我们经常会遇到一个页面存在很多模块,存在页面交互或者加载数据过多等问题,这种时候,我们很可能会考虑到通过使用部分页来解决这个问题(ps:当然还有很多的解决方案,在这里只是简单介绍这 ...

  8. 方便的 IcoMoon 图标字体

    官网地址:https://icomoon.io/app/#/select 已发现的方便之处: 1.官网已提供大量常用图标字体: 2.可通过 svg 将其转换为 图标字体: 3.不仅可转换,还可自定义编 ...

  9. Windows设置Tomcat的管理员的用户和密码

    我们首先打开Tomcat的配置文件,具体如下:(conf目录下的tomcat-users.xml) 删除原有的<tomcat-users>,加入如下代码 <tomcat-users& ...

  10. Appium-测试失败后获取屏幕截图的方法

    最近一直在研究appium,偶尔的机会发现断言后获取屏幕截图.觉得这个方法不错,分享给大家 这样以后在遇到断言,想截图错误屏幕的时候,能够用的上. 1.首先需要2个类,一个是测试类(TestDropL ...