C语言 1字节signed char的范围为什么是-128~127?
参考
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?的更多相关文章
- 浅析为什么char类型的范围是 —128~+127
转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...
- [转载]浅析为什么char类型的范围是 —128~+127
http://blog.csdn.net/daiyutage/article/details/8575248 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写, ...
- 浅析为什么 char 类型的范围是 : -128~+127
在 C 语言中. signed char 类型的范围为 -128~127,每本教科书上也这么写.可是没有哪一本书上(包含老师)也不会给你为什么是 -128~127,这个问题貌似看起来也非常easyea ...
- 解读为什么有符号的char可表示范围是-128~+127
问:为什么有符号的char可表示范围是-128~+127? 要明白这个问题,首先要明白一下几点: 对于char和int计算机中以补码形式存在. 严格来说计算机就是傻逼,它只知道某个位上是0还是1. 我 ...
- Byte 一个字节的数据大小范围为什么是-128~127
一个字节是8位,最高位是符号位,最高位为0则是正数.最高位为1则是负数 如果一个数是正数,最大数则为:01111111,转为十进制为127, 如果一个数是负数,按照一般人都会觉得是11111111,转 ...
- char、signed char 和 unsigned char 的区别
ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.而不是像short.int一样只有两种(int默认就是signed int). 三者都占1个字节( ...
- char , unsigned char 和 signed char 区别
ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char.char相当于signed char或者unsigned char,但是这取决于编译器!这三种字符 ...
- c语言数据类型字节长度
突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度.google各种查找,各种书籍:<C++ Primer>.<C程序设计语言>查看,终于明 ...
- C 中 char、signed char 和 unsigned char 的区别
C 中 char.signed char 和 unsigned char 的区别 来源:http://bbs.chinaunix.net/thread-889260-1-1.html 参考:https ...
随机推荐
- map文章
STL map常用操作简介 http://www.kuqin.com/cpluspluslib/20071231/3264.html STL中map用法详解 http://www.kuqin.com/ ...
- 线段树 区间查询最大值,单体修改 hdu 1754
#include<cstdio> #include<algorithm> #include<string.h> #include<math.h> #in ...
- 使用pyaudio播放无损音乐(wav)
安装pyaudio sudo apt-get install python-pyaudio python3-pyaudio pip3 install pyaudio 执行第二步可能会遇到如下错误: 根 ...
- Python 树莓派 引脚
#!/usr/bin/python3 import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OU ...
- spark启动start-all.sh报错
报错信息如下: spark02: failed to launch: nice -n 0 /usr/local/softwareInstall/spark-2.1.1-bin-hadoop2.7/bi ...
- STM32开发记录
一.使用keil时经常遇到的问题 1.没有下载固件包 2.下载器没选择对 3.没安装下载器的驱动 二.关于数据手册和开发手册 1.如何下载这些手册 在官网下载,官网永远是一手资源 意法半导体官网:ww ...
- rg.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'TL_C_CONS_ExtendController':
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'TL_ ...
- 2019CSP-S T1格雷码
题目大意: 格雷码(Gray Code)是一种特殊的 nn 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻. nn 位格雷码不止一种,下面给出其中一 ...
- Flutter Container 组件、Text 组件详解
Text 组件 textAlign 文本对齐方式(center 居中,left 左对齐,right 右对齐,justfy 两端对齐) textDirection 文本方向(ltr 从左至右 ...
- 使用ssh 初始化git一个空java工程
1:进入git 目录 cd /home/git/repo/ 2:创建一个java工程名 mkdir qft-payment 3:进入工程 cd qft-payment/ 4:初始化空工程 git - ...