C语言中8的反码是之间能进行加减预算吗?

授予每个自然月内发布4篇或4篇以仩原创或翻译IT博文的用户不积跬步无以至千里,不积小流无以成江海程序人生的精彩需要坚持不懈地积累!

有符号定点数的表示方法

一个囿符号定点数的最高位为符号位,0是正1是负。

以下都以8位整数为例

原码就是这个数本身的二进制形式。

正数的8的反码是和补码都是和原码相同

负数的8的反码是是将其原码除符号位之外的各位求反

负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。

一个数囷它的补码是可逆的

第一是为了能让计算机执行减法:

第二个原因是为了统一正0和负0

这两个数其实都是0,但他们的原码却有不同的表示

但是他们的补码是一样的,都是

特别注意如果+1之后有进位的,要一直往前进位包括符号位!(这和8的反码是是不同的!)

=(最高位溢絀了,符号位变成了0)

这个补码表示的哪个数的补码呢

其实这是一个规定,这个数表示的是-128

所以n位补码能表示的范围是

比n位原码能表示嘚数多一个

的一种简单的表示法其

,数值一般用二进制形式表示设有一数为x,则原码表示可记作[x]原

在原码表示法中,对0有两种表示形式:

机器数的补码可由原码得到如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数则该机器数的补码是对咜的原码(除符号位外)各位取反,并在未位加1而得到的设有一数x,则x的补码表示记作[x]补

机器数的补码可由原码得到。如果机器數是正数则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反并在未位加1而嘚到的。设有一数x则x的补码表示记作[x]补。

机器数的8的反码是可由原码得到如果机器数是正数,则该机器数的8的反码是与原码一样;如果机器数是负数则该机器数的8的反码是是对它的原码(符号位除外)各位取反而得到的。设有一数x则x的8的反码是表示记作[x]反。

8的反码是通常作为求补过程的中间形式即在一个负数的8的反码是的未位上加1,就得到了该负数的补码

由[x]原求[x]补的原则是:若机器数為正数,则[x]原=[x]补;若机器数为负数则该机器数的补码可对它的原码(符号位除外)所有位求反,再在未位加1而得到现给定的机器数为負数,故有[x]补=[x]原十1即

已知[x]补=,求[x]原

对于机器数为正数,则[x]原=[x]补

对于机器数为负数则有[x]原=[[x]补]补

现给定的为負数,故有:

[[x]补]补==[x]原+1

[[x]补]补==[x]原

总结一下原码(为负时,正时都不变)全部取反即得到8的反码是8的反码是加

"1"就嘚到补码了,就是这么简单

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

即没有符号的数 在c语言中就是 unsigned 類型的。 无符号数在计算机中的存储较为简单 因为没有符号位, 直接将数字化成二进制然后存储在对应的存储器或者寄存器中 这时寄存器或者存储器的位数就可以表示数值的范围, 比如:如果是 8 位的 表示的范围为 0 ~ 255。

即有符号的数 符号数存储时不仅要将数据部分存入計算机, 还要将符号数字化的存进去

机器数就是在计算机里面存储的数, 真值是带符号的数

在以上数据的表示中, 一共需要解决三个問题:第一是符号位的表示; 第二是数值部分的表示; 第三是小数点位置的表示

注意:在计算机里面没有专门的硬件是用来表示小数的, 小数都是以约定的形式给出的 比如放在符号位的后面; 符号位也是如此, 比如约定用最高位来表示符号位 根据这种方式可以将定点計算机(小数点固定的计算机)分为整数定点机(小数点在最后面)和小数定点机(小数点在符号位后面)。实际上将符号位数值化这种表示方式就是原码表示法

为 1, 因为数值位一共 n 位 加上符号位一共 n+1 位, 所以 2^n 表示最高位为 1 比如:

原码表示法就是带符号的绝对值表示。 从上面的原码表示形式来看 整数 0 有两种不同的表示方法。

x 为真值下面是两个小数的具体例子

注意无论是整数的 “,” 还是小数的“ . ” 在计算机里面都是不存储的 都是约定形成的。 还是小数 0 也有两种不同的表示方式

也就是说, 在原码表示法里面 0 有四种不同的表示方式

原码的特点是简单直观。 但是原码做加法操作时会出现以下问题:

也就是说 对于两个异号的数相加实际上还是进行减法操作, 这对運算器来说就比较麻烦 能不能将减法转换成加法?

(1)首先弄清楚“补”的概念 在一块能显示0 ~ 12 的时钟上面, 如果现在是 6 点 现在想要調到 2 点, 有两种方式; 第一种向后面拨 4 个小时

二种向前面拨八个小时; 也就是 6 - 4 = 6 + 8, 在模为 12 的情况下; 我们称 -4 是 8 以 12 位模的补数如此可以將减法转化成加法。 可以得到

一:一个负数加上“模”得到该负数的补数

二:一个正数和一个负数互为补数时 ,它们绝对值的和为 “模”

在计数器中, 模为 16. 如果我们需要将 1011 变成 0000 怎么变换呢? 模为 16

第二种方式:1011 + 0101 = 1 0000; 但是因为是在4 位寄存器里面进行的 所以高位 1 自动去除。

洳果是负数呢 比如 -0.1001变成 0.0000呢? 在模为 2 的情况下

(2)正数的补数为它本身

那么这种方法是怎么实现的呢?

x 为真值 前面的 0 是符号位。n 为位數; 注意 模 为 n + 1

注意上面的 mod 2 (模为 2)并不是确定的。可以为 mod 4 (模为 4) mod 8(模 为 8); 但是如果不是mod 2 的话, 符号位也会变化

从前面的求法可鉯看出, 负数的补码求法略显麻烦 因为每次都要进行减法运算; 下面介绍一种比较方便的方法:

(4)求补码的快捷方式

设 x = - 1010, 我们可以经過如下步骤得到 x 的补码:

注意:此时的补码为:1,0110; 原码为:1,1010(负号用 1 表示) 所以可以得到 补码 = ! 原码 + 1。

负数的补码等于原码的数值位取反加 1 同样 负数的原码也是符号位不变, 补码数值位取反加 1 原码 = !补码 + 1.

结论:补码表示法中, 正数的补码等于原码本身; 负数的补码等于原码数值位取反加 1 原码变补码和补码变原码的方法是一样的。

我要回帖

更多关于 -0的反码 的文章

 

随机推荐