#2007. C++-问与答-补码反码原码

C++-问与答-补码反码原码

Background

Description

整数的二进制表示有三种,分别为原码、补码与反码。正整数的原码、补码与反码相同,而负整数的原码、补码与反码是需要计算的。

image

当计算机进行数字运算时,经常需要用到二进制数来表示数字。而在二进制数的表示中,正数和负数的表示方式是不同的。为了解决这个问题,人们引入了补码和反码的概念,以及与原码之间的转换方法。本篇博客将详细介绍补码、反码以及它们与原码之间的转换。

一、什么是补码 计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同 。

在计算机系统中,数值一律用补码来表示和存储。它的定义如下:

对于一个n位二进制数,如果它为正数,他的补码等于原码本身,如果它为负数,它的补码为将这个数除符号位以外的所有位取反(0变成1,1变成0),然后加1所得到的结果。

例如,对于一个8位的二进制数10011010,它的补码为11100101 + 1 = 11100110。

其中11100101是10011010除第一位符号位以外的所有位取反得到的。

补码有以下几个特点:

补码能够表示正数和负数,而且在计算机中,通常只采用补码进行运算。

正数的补码与原码相同,而负数则采用补码表示。

在补码中,一个数的绝对值与它的反码相同。

二、什么是反码 反码是另一种用来表示负数的二进制数的方法。它的定义如下:

对于一个n位二进制数,如果它是负数,则它的反码为将这个数的所有位取反(0变成1,1变成0)所得到的结果;如果它是非负数,则它的反码与原码相同。

例如,对于一个8位的二进制数(第一位为符号位)10011010,它的反码为11100101。

反码有以下几个特点:

反码能够表示整数和负数,但在计算机中并不常用。

在反码中,一个数的绝对值与它的补码相同。

三、原码与补码之间的转换 对于一个原码,可以将它转换成补码,然后再进行运算。转换的方法如下:

如果原码为正数,则它的补码与原码相同。

如果原码为负数,则将原码的绝对值转换成二进制数,然后将这个二进制数除符号位外的所有位取反,最后加1,得到的结果即为它的补码。

例如,将-6转换成补码的过程如下:

将-6转换成二进制数:10000110。

将-6的二进制数除符号位的所有位取反:11111001。

将取反后的结果加1:11111010,这就是-6的补码。

四、补码与原码之间的转换 补码和原码之间的转换也是十分重要的。当我们需要将补码转换成原码时,可以按照以下步骤进行:

如果补码的最高位是1,说明这个补码所代表的数是负数。将补码除符号位外的所有位取反(0变成1,1变成0),得到反码。

在反码的基础上,将所有位加1,得到原码。

例如,将补码11100111转换成原码的过程如下:

最高位是1,说明这是一个负数。将补码除符号位外的所有位取反得到反码:10011000。

在反码的基础上,将所有位加1,得到原码:10011001,即-25。

当需要将原码转换成补码时,也可以按照以上步骤进行,反向转换即可。

五、总结 补码和反码是用来表示负数的二进制数的方法,其中补码是计算机中通常使用的方法。在进行数字运算时,需要将原码转换成补码进行计算。在计算结果得出后,需要将补码转换成原码才能得到正确的结果。

Format

Input

Output

Samples



Limitation

1s, 1024KiB for each test case.