数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。
计算机为什么要用补码存储整型
这得从二进制的原码说起:
如果以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767
最小为1111111111111111=-2的15次方减1=-32767
此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0
所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。
但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。
到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。
所以,补码系统中,范围是-23768~32767。
因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。
整型的宽度是一个字,也就是2个字节,16个二进制位,最高一位二进制位用来表示符号(正或负),那么剩下的15位来表示数值。
所以,有:
01111111 11111111是32767,最大的正整数
00000000 00000001是1
00000000 00000000是0
11111111 11111111是-1(不是-32767)
10000000 00000001是-32767(不是-1)
10000000 00000000是-32768(不是-0),最小的负整数
-32768在内存中的表示是10000000,00000000。过程是:先读入正值32768(10000000,00000000),再取反(01111111,11111111),再加1(10000000,00000000)
计算机表示数主要从运算方式的一致性来考虑。
比如00000000 00000001表示1很好理解,但是11111111 11111111为什么是-1呢?
按照二进制加法
11111111 11111111 + 00000000 00000001= 1 00000000 00000000
结果超出了整型的宽度,溢出部分被忽略,最后的计算机结果是00000000 00000000
那么换成十进制,?+1=0,所以11111111 11111111表示成十进制就是-1
分享到:
相关推荐
在C++中,我们可以用int、short、long等有符号整型变量来存储带符号的数字,这些变量在内存中是以补码形式存储的。例如,对于一个8位的二进制数,若最高位为0,则表示正数,如0000 0001表示+1;若最高位为1,则表示...
关于补码的经典认识,是计算机科学与信息技术领域中一个至关重要的概念,它涉及到二进制数的表示方式,尤其在处理负数时显得尤为重要。补码的引入,旨在解决传统原码表示法在进行算术运算时存在的问题,如加减法不...
- 使用n位反码或补码表示的有符号整数范围为 \(-2^{n-1}\) 至 \((2^{n-1} - 1)\)。 #### 六、算术运算的简化 在计算机中,补码表示法极大地简化了算术运算,尤其是加减法。对于两个补码表示的数,可以直接进行加法...
短整型同样占用2个字节,其取值范围与基本整型相同,为-32768到32767。与基本整型一样,它的有符号和无符号版本也会受到相同的字节数限制。 3. 长整型(long int): 长整型一般占用4个字节,即32位,其取值范围...
- 最小整数-32768的原码为1000000000000000,按照格式高位补0,得到00000000 00000000。 5. **绝对值最小数(0)** - **十进制整数**: 0 - **内存整型数据**: 00000000 00000000 - **内存地址号**: 00010000 ...
因此,最大正数32767(0111 1111 1111 1111)加1后变成最小负数-32768(1000 0000 0000 0000),形成一个循环。 2.8 整型字面量升序排列: 0xac(1010 1100)按字节顺序排列,需要了解整数在内存中的存储方式,通常...
- 补码、反码、原码:在计算机中,负数的表示使用补码形式。原码指的是一个数的二进制表示;反码是将原码中所有位取反(0变1,1变0);补码是反码加1。正数的原码、反码、补码都相同,而负数则不同。 5. 二进制数...
整型数的存储涉及原码、反码和补码的概念,其中补码是计算机中最常用的表示法。 补码的特点是正数的补码与原码相同,而负数的补码是其原码除符号位外各位取反后加一。例如,一个无符号短整型数65536在内存中实际...
- `int`:基本整型,通常占用2字节,其数值范围为-32768至32767。 - `short`:短整型,同样占用2字节,但范围稍小,为-2^15至2^15-1。 - `long`:长整型,占用4字节,数值范围为-2^31至2^31-1。 - `unsigned`:...
例如,`int a = 650000`转换为`short b`,高位字节被截去,b的值为1001010011110000(补码表示的负数),计算后b的数值为-128。 2. 同一长度整型数据之间的转换 同一长度的整型数据转换通常不会改变数值,但要注意...
- **理解编译系统的工作原理很重要**:阐述了为什么掌握编译过程对程序员至关重要。 - **处理器读取并解释存储在内存中的指令**: - **硬件组织系统**:介绍了计算机硬件的基本组成部分及其组织方式。 - **运行 ...
对于16位的整型数据,正整数如256用二进制表示为000000000000000000001000,而负整数如-256则使用补码表示,即111111111111111111111000。最大正整数32767的二进制表示为0111111111111111,最小负整数-32767的补码为...
### 深入理解计算机系统——从程序员的视角出发 #### 一、引言与概述 本书《深入理解计算机系统》旨在帮助读者从程序员的角度理解计算机系统的内部运作机制。通过这种方式,读者能够更好地掌握如何编写出更加高效...
书中会介绍不同数据类型(如整型、浮点型)的二进制表示方法,包括原码、反码、补码以及无符号数的表示。此外,还会涉及到二进制与十进制、八进制、十六进制之间的转换。 2. **运算器**:运算器是计算机中执行算术...
有符号类型需要使用一个bit 来表示数字的正负,比如 16 位系统中一个 int 能存储的数据的范围为-32768~32767(16 位 2 进制的最高位作为符号位‘1’为负‘0’为正)。 Unsigned 关键字: Unsigned 类型是指不使用...
- short:16位、有符号的二进制补码整数,范围是-32768到32767。 - int:32位、有符号的二进制补码整数,范围是-2^31到2^31-1。 - long:64位、有符号的二进制补码整数,范围是-2^63到2^63-1。 - float:32位IEEE ...