有符号数处理

在数学中,任意基数的负数都在最前面加上“−”符号来表示。在计算机硬件中,数字都以无符号的二进制形式表示,因此需要一种将负数编码为二进制形式的方法。

当前有以下四种方法,用于扩展二进制数字系统,来表示有符号数:

原码(sign-and-magnitude),

反码(ones‘ complement),

补码(two‘s complement),

移码(excess-N)。

在学习原码, 反码、补码和移码之前, 需要先了解机器数和真值概念。

1、机器数

机器数:数在计算机中的二进制表示形式。

机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。

例如:

计算机字长为8位,则:

十进制数+3 ,转换成二进制00000011,

十进制数-3 ,转换成二进制10000011。

那么,这里的00000011和10000011就是机器数。

2、真值

因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。即第一位用+-表示数字的正负,其余为二进制数。

例如:

0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

3、原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

下图为原码计算公式:

4、反码

反码的表示方法正负数不同:

正数的反码是其本身,

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

下图为反码计算公式:

5、补码

补码的表示方法正负数也不同:

正数的补码就是其本身,

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基
础上+1)。

下图为补码计算公式:

6、移码

移码,是将二进制原码无符号整数所代表的值,减去一个预设值。

标准移码,预设值为二进制原码表示的最大整数的一半。 一个数的标准移码和补码,最高位相反,其余各位均相同。即不管正负数,只要将其补码的符号位取反即可。

下图为移码计算公式:

PS:正数的原、反、补码都一样;0的原码跟反码都有两个,因为这里0被分为+0和-0;0的补码是唯一的。

时间: 2024-08-07 13:53:00

有符号数处理的相关文章

有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的

一.有符号数的加减法 1.符号数与无符号数的人为规定性: 一个数,是有符号数还是无符号数都是人为规定的.进行二进制运算时用无符号数或是补码运算时,结果都是正确的. 10000100+00001110 若规定为无符号数,即 132+146=146D . 若规定为符号数,则为-124+14=-110,而[-110]补=10010010.解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码.机器中的有符号数的运算一般就是补码的运算. 2.补

Booth算法(有符号数的乘法)

求 M3M2M1M0×Q3Q2Q1Q0 :  0110×0101  (有符号数用补码表示,最高位表示正负) 1.添加辅助位:A=0000     Q-1=0 2.控制逻辑判断: ①Q0Q-1=01 时:A=A+M 然后 A.Q.Q-1算术右移 (两步) ②Q0Q-1=10 时:A=A-M  然后 A.Q.Q-1算术右移 (两步) 补码加减:(A-M)补码=A补码+(-M)补码 ③Q0Q-1=00或11 时:A.Q.Q-1算术右移 (一步) 补码右移:空位填1 3.Q有几位就做几次右移运算.(如:

有符号数和无符号数负数(转)

有符号数和无符号数负数 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切.再者,用"补码"表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算.却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高

有符号数和无符号数

摘抄自:http://www.cnblogs.com/glacierh/archive/2013/07/16/3194658.html 1.      补码 在计算机中无符号数用原码表示,有符号数用补码表示.w位补码表示的值为: 最高位 也称符号位,1表示负数,0表示正数,符号位为0时,和无符号数的表示是相同的,以下是4位补码的示例: 0101 = -0*23 + 1*22 + 0*21 + 1*20 = 5 1101 = -1*23 + 1*22 + 0*21 + 1*20 = -3 w位的补

C语言之有符号数和无符号数

我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时候需要使用有符号数来表示一个整数,因此我们规定,当最高位为1的时,表示为负数,最高位为0时,表示为正数. 1:有符号数和无符号数在数值上的区别. 有符号数的最高位用来表示符号,所以在最大的数值上,有符号数的最大值小于无符号数.以一个字节为例: 有符号数的取值范围为:-128 - 0 - 127 无符

有符号数、无符号树混合计算问题。

今天在线刷题,其中一个问题总是结果跟期望的不一样,在一次次的检查程序逻辑.确认无误后,还是不能通过,不得已用VS开始调试! 这里是我的程序代码: 1 // maxDepth.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<vector> 6 #include<iostream> 7 #include<limits.h> 8 9 using namespace std; 10 1

FPGA中的有符号数和无符号数的运算

在FPGA设计中,所有的算数运算符都是按照无符号数进行的.如果要完成有符号数计算,对于加.减操作通过补码处理即可用无符号加法完成.对于乘法操作,无符号数直接采用“*”运算符,有符号数运算可通过定义输出为 signed 来处理. 需要注意的是,尽量不要使有符号数与无符号数进行混合计算.因为只要有一个无符号数的运算单元,整个算式将被将成无符号数进行计算.   总之,正数和负数处理时都是按照补码的形式处理,具体究竟把这些补码理解为符号型还是无符号型,这就要看reg signed这样的声明了.如果声明了

关于操作有符号数的溢出问题

在计算机中,数值的二进制表示方法主要有:原码.反码和补码.通常取最高位为符号位,0表示正数,1表示负数.正数的原码.反码.补码一样.而负数的原码最高位取1,数值位取负数绝对值的二进制值:反码的符号位为1,其余位取反:补码的符号位为1,其余位取反加1. 在32位计算机中,有符号字符型变量的取值范围是-27 ~ 27-1,有符号整型变量的取值范围是-215~ 215-1,如果将有符号整型变量赋给有符号字符型变量,则高位被截断,保留低八位. 看一个例子: #include<stdio.h> #inc

理解有符号数和无符号数

负数在计算机中如何表示呢? 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切.再者,用"补码"表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算.却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是0,表示正数,最高位是1,表示负数.这种说法本身没错,可是如果没有下文,那么它

C语言基础(5)-有符号数、无符号数、printf、大小端对齐

1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码 无符号数最小为0,不可能是负数 定义一个无符号的int unsigned int a; //使用unsigned int 定义了一个无符号的int变量,名字叫a short,long,long long,