为何八位有符号整数的范围是-128~127,而不是-127~128

简介:

八位的带符号的整数,比如JAVA中的byte,c#中的SByte,为什么值域范围都是-128-127而不是-127~128?

事实上,远古时期有些计算机的设计是采用了反码表示有符号数的,因此8位有符号数的范围是-127~127,它的一个缺点是0是有正负。它用一位表示正负数,然对剩余的位数采用取反。

比如,0111 1111表示127,那-127的则是1000 0000。0000 0000表示正的0,而1111 1111则表示成为负0。因此反码作为有符号的整数并未流行。

现在的计算机中,通常将正数的补码来表示其负数,采用补码的好处是在硬件电路的实现上,只要使用一种加法电路就可以处理各种有符号数的加减计算,使得电路设计简单。

而补码计算方式为取反码加1,比如,对于正数0000 0001的一个补码计算,

首先取反码成为1111 1110,然后+1,变成1111 1111。所有-1的表示就是1111 1111

那么问题来了,八位整数中,如果首位表示正数,那么最多就到127,无法128,那么-128是怎么出来的?

如果我们假设1000 0000表示的是128,取反码,得到的是0111 1111,再加1有变成了1000 0000,也就是128的反码就是它本身,128和-128是一个数。由于在计算机中表示有符号数时,通常将最高有效位为0的认为是正数,最高有效位为1的认为是负数,因此1000 0000就表示为-128了。所以8位有符号整数的范围是-128~127。

事实上,还有一个更好理解的方式,-127的表示方式为1000 0001,那么-128=-127-1

即-128=1000 0001-0000 0001=1000 0000















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1634923,如需转载请自行联系原作者











目录
打赏
0
0
0
0
143
分享
相关文章
有符号位与无符号位超超超详解!!!
有符号位与无符号位超超超详解!!!
321 0
大/小端字节序 原码反码补码 有符号整型无符号整形 相关例题
大/小端字节序 原码反码补码 有符号整型无符号整形 相关例题
96 0
获取一个整数二进制序列中所有的偶数位和奇数位
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
169 0
整数和浮点数的任意进制转!!(包括16进制)确定不进来看看?!
整数和浮点数的任意进制转!!(包括16进制)确定不进来看看?!
171 0
【计算机系统】整数与浮点数【详解】(二)有符号数与无符号数、截断
【计算机系统】整数与浮点数【详解】(二)有符号数与无符号数、截断
609 0
【计算机系统】整数与浮点数【详解】(二)有符号数与无符号数、截断
打印整数二进制的奇数位和偶数位
打印整数二进制的奇数位和偶数位
97 0
|
10月前
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
用一行代码(宏)交换一个二进制整数的奇数位和偶数位
交换一个整数二进制表示中的奇数位和偶数位
题目 原文: 写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现。 (比如,第0位和第1位交换,第2位和第3位交换…) 解答 这道题目比较简单。分别将这个整数的奇数位和偶数位提取出来,然后移位取或即可。
982 0
C++鲜为人知的符号
C++鲜为人知的符号.pdf 1.       引言 这些鲜为人知的C++符号,可直接在代码中使用,但实践中不推荐这么做,可作为茶余饭后的乐趣了解C++的另一面。 虽然它们鲜为人知,但却不是GNU g++独有的,而是C++标准定义的,找一本C++标准书或pdf文档看看,就可以见到它们赫然在目。
861 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等