参考

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. SCROLLINFO结构详解

    在刚开始使用SCROLLINFO结构时感觉很不顺手,尤其其中的成员fMask理解不太深刻,经过查询资料才理解一二. 在使用滚动条功能时,如果要设置它的范围和位置可以用以前的函数,例如:SetScrol ...

  2. 树链剖分-Hello!链剖-[NOIP2015]运输计划-[填坑]

    This article is made by Jason-Cow.Welcome to reprint.But please post the writer's address. http://ww ...

  3. opencv:形态学梯度

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  4. Educational Codeforces Round 76 (Rated for Div. 2) A. Two Rival Students

    You are the gym teacher in the school. There are nn students in the row. And there are two rivalling ...

  5. Java进阶学习(5)之设计原则(上)

    设计原则 城堡游戏 扩展 字符串被分割 String line = in.nextLine(); String[] words = line.split(" "); 消除代码复制 ...

  6. jmeter实现一次登录,多次业务请求(不同线程组间共享cookie和变量)

    实现目的 很多时候,在进行性能测试时,需要先登录,然后再对需求的事务进行相关性能测试,此时的登录操作,并不在本次性能测试的范围内,所以我们只需要登录一次,然后获取登录成功后的cookie等,并将coo ...

  7. javaScript中的querySelector和querySelectorAll

    querySelector和querySelectorAll是W3C提供的 新的查询接口,其主要特点如下: 1.querySelector只返回匹配的第一个元素,如果没有匹配项,返回null. 2.q ...

  8. Python(五) 迭代器(Iterable/Iterator/iter())

    原文的链接:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143178254 ...

  9. 【MySQL】库的操作

    "SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发. SQL语言分为3种类型: DDL语句 数据库定义语言:数据库.表.视图.索引.存储过程,例如C ...

  10. Hadoop重新格式namenode后无法启动datanode的问题

    这个很简单的哇~ 格式化namenode之后就会给namenode的ClusterId重新生成,导致与datanode中的ClusterId不一致而无法启动datanode 解决方法: 进入hadoo ...