精华内容
下载资源
问答
  • 整数补码——如何定义相反数。

    千次阅读 2017-11-11 21:31:40
    整数补码——如何定义相反数。 出现的原因 想要表示3+5,可以转化为8位2进制:0000 0011+0000 0101=0000 1001。 结合二进制加法,这是很容易的。那么减法该怎么办? 3-2=3+(-2),那么我们只要表示-2即可。...

    整数补码——如何定义相反数。

    出现的原因

    想要表示3+5,可以转化为8位2进制:0000 0011+0000 0101=0000 1001。

    结合二进制加法,这是很容易的。那么减法该怎么办?

    3-2=3+(-2),那么我们只要表示-2即可。为此,我们提出了反码来表示一个整数的相反数

    原理

    以8位2进制为例:一个整数的储存只能转化为8位2进制,如果是9位的,那么第9位就溢出了。形象一些来讲:计算机的视野只能看到8位,多了一位进来就把第9位顶出去了,但是计算机只能看到8位,所以第9位它是看不到的。

    利用这个特点,我们设计出了补码系统。设我们现在用的是X位2进制,也就是说:如果我们想要表达一个大于2^X的正整数,那么X位2进制是存不下这个数字的,转换为2进制后,这个数字将从右向左数X位存入,剩下的左边的数字就被裁掉了。

    以8位2进制为例,例如:

    其中

    可以看到这是一种类似于“周期”的特性。以8位二进制为例,那么这个周期就是:

    由于"周期"+"溢出",我们很自然的得到了一个"用周期溢出表示相反数"的方法.

    用周期来减一个数字,就可以得到它的负数。根据这个方法,我们就可以设计储存相反数了。

    例子

    先看一个例子:

    假设我们使用8位2进制表示2的补码:

    用这个8位2进制所能表达的最大整数+1,也就是周期来减。我们先写出这个周期为:

    但是由于8位2进制只能有8位,我们这个周期有9位,无法运算,所以我们把它拆成两步:

    所以我们先用第一部分

    不难发现这一部分的运算有一个特点:给减数求反。这就是反码的由来。

    再用得到的结果加上刚刚的1得:

    右面的这个数就是2的补码:-2.

    这就是“按位取反再加1”的由来。这样我们就可以进行减法操作了,即:

    由于我们采用8位2进制,最左面一位1将会溢出,最后储存在这个8位2进制变量中的2进制数为:

    这样一来,我们就可以表示减法了。

    进一步地思考

    回头看8位有符号整数的储存:最左边一位为0则表示非负数,最左边一位为1则表示负数。因此8位有符号整数可以表示的数字范围是:

    其中

    这与补码有什么关系呢?容易证明,只要我们定义右7位表示的数为非负数,通过取反码自然可以得到负数的8位2进制表示,最左侧位一定为0.这告诉我们:在支持反码的系统中,n位2进制只能表示:

    其中

    更进一步地

    假设系统支持补码,那么如果从小到大排列所有的位进制数那么前位一定是非负数后位一定是负数

    这也解释了为什么两个正数相加可能会溢出得到负数——这运用到了补码的“溢出”原理。

    原理的数学解释

    事实上,如果引入数论中同余的概念,这一性质将会更容易被展现:

    同余的线性运算性质

    举例来说:

    待补充……(似乎用数论的观点看待有点复杂化了)

    参考资料

    1.黄程程讲编程 Java016 深入理解二进制及整数补码

    2.原码, 反码, 补码 详解

    展开全文
  • 正确的表述为:如果某计算机采用6(二进制数)表示整数,那么使用补码分别能够表示的整数范围是-32~31。6表示有符号的二进制数,则最高是符号,因此有效能表示数值的二进制是5,5二进制数最大是11111...

    错误。正确的表述为:如果某计算机采用6位(二进制数)表示整数,那么使用补码分别能够表示的整数范围是-32~31。

    6位表示有符号位的二进制数,则最高位是符号位,因此有效能表示数值的二进制位是5位,5位二进制数最大是11111B=100000B-1,对应下面的二进制基数表(个位1,高位=低位*2),

    发现100000B=32,因此11111B=31D,这是能表示的最大正数,负数比正数能多表示一个,因此6位二进制有符号数能表示的范围为-32~+31。

    f54b3404da72d097f142321e452b346f.png

    扩展资料:

    计算机运算基础采用二进制。电脑的基础是二进制。在早期设计的常用的进制主要是十进制(因为我们有十个手指,所以十进制是比较合理的选择,用手指可以表示十个数字,0的概念直到很久以后才出现,所以是1-10而不是0-9)。

    电子计算机出现以后,使用电子管来表示十种状态过于复杂,所以所有的电子计算机中只有两种基本的状态,开和关。也就是说,电子管的两种状态决定了以电子管为基础的电子计算机采用二进制来表示数字和数据。

    参考资料来源:百度百科-二进制数字

    展开全文
  • 正整数的补码、反码均同其原码。...一个求负整数补码的技巧是: 1、求负数绝对值的原码; 2、从原码的最后一往前数,当遇到第一个1时停在此位置; 3、将第一个1前面的全部取反。 对signed cha...

    参考自[关于求负数补码](https://www.cnblogs.com/chiweiming/p/8932140.html)
    正整数的补码、反码均同其原码。负整数的补码是其反码(保留符号位,其他位取反)再+1,这将涉及进位操作。一个求负整数补码的技巧是:
    1、求负数绝对值的原码;
    2、从原码的最后一位往前数,当遇到第一个1时停在此位置;
    3、将第一个1位前面的位全部取反。
    对signed char而言,表达范围为[-2^7 ,  2^7-1]

     原码反码补码规律
    1270111 1111** 
    10000 0001** 
    00000 00000111 11110000 0000 
    -11000 00011111 11101111 11111原码最右的1位左边所有位取反
    -1271111 11111000 00001000 0001127原码最右的1位左边所有位取反
    -1281000 00001111 11111000 0000128原码本身
    //递推求整数(正整数、负整数)二进制原码
    	int GetBinaryDiTui(int n, vector<int>& arr) {
    		if (n<-1 * (pow(2, 7) - 1) || n>pow(2, 7)) return 0; //限求unsigned char
    		arr = vector<int>(8, 0); 
    		if (n < 0) {
    			arr[0] = 1;
    			n = -1 * n;
    		}
    		int nCount = 0;
    		int a = 0;
    		while (n) {
    			a = n % 2;
    			nCount++;
    			arr[arr.size() - nCount] = a;
    			n = n / 2;
    		}
    		return 1;
    	}
    	//求整数(正整数、负整数)二进制补码
    	void GetBinaryBuCode(int n, vector<int>& arr) {
    		if (n >= 0) {
    			GetBinaryDiTui(n, arr);
    			return;
    		}
    		else {
    			GetBinaryDiTui(-1*n, arr); //求负数绝对值的原码
    			int nindex = arr.size() - 1;
    			while (arr[nindex] == 0) nindex--;
    			int n = 0;
    			while (n < nindex) {
    				arr[n] = arr[n] == 0 ? 1 : 0;
    				n++;
    			}
    			return;
    		}
    	}

     

    展开全文
  • 我们知道,计算机的都是用二进制的开关电路实现的。整数、浮点数、字符串在计算机中的实现都有相应...如4个补码方案可以表示的数据范围补码输出二进制的代码:利用移位运算、与运算取最的方法可以输出补码...

    我们知道,计算机的都是用二进制的开关电路实现的。整数、浮点数、字符串在计算机中的实现都有相应的编码方案,如补码、IEEE574的浮点数表示法、ASCII字符编码方案(用整数表来编码字符)。

    1 补码及二进制输出

    6b24a731feab4abe55f33f2bd04050de.png

    负数如何用补码表示?

    先表示为自然码(原码)。

    将自然码的每一位取反码。

    在最低位加“1”。

    e5d22bc3e6a966ea6747c52369917b21.png

    如4个位的补码方案可以表示的数据范围:

    4462e4eb738fc5af800f3d31ab1015f4.png

    补码输出二进制位的代码:

    利用移位运算、与运算取最位的方法可以输出补码的每一个二进制位。

    #include using namespace std;void main(){while(1){int n;cin>>n;//最好有边界检查int h=1;h=h<<31;//32位,最高位1,其它位是0for(int i=1;i<=32;i++){if((n&h)==0)cout<<0;else cout<<1;n=n<<1; //左移一位,右位补0if(i%4==0)cout<

    2 浮点数的IEEE574表示法

    现代计算机中,一般都以IEEE 754标准存储浮点数,这个标准的在内存中存储的形式为:

    对于不同长度的浮点数,阶码与小数位分配的数量不一样,如对于32位的单精度浮点数,数符分配是1位,阶码分配了8位,尾数分配了是23位:

    a04bcbaa4802c84696a973f3ea12af22.png

    符号位:0表示正;1表示负;

    偏移阶码e:e=指数的实际值+127。

    如有一个浮点数10110010.001,则指数是7,阶码就要用7+127的二进制数表示,也就是:111+01111111 = 10000110 =134

    尾数使用原码表示,绝对值在1与2之间,其中1和小数点都是隐含的,并不直接表示。

    上面浮点数的尾数就是0110010001

    fa6b6fabaec6c207388e69dee7a87b1c.png

    根据这个标准,我们来尝试把一个十进制的浮点数转换为IEEE754标准表示。

    例如:178.125

    先把浮点数分别把整数部分和小数部分转换成2进制:

    整数部分用除2取余的方法,求得:10110010

    小数部分用乘2取整的方法,求得:001

    合起来即是:10110010.001

    转换成二进制的浮点数,即把小数点移动到整数位只有1,即为:1.0110010001 * 2^111,111是二进制,由于左移了7位,所以是111

    把浮点数转换二进制后,这里基本已经可以得出对应3部分的值了:

    数符:由于浮点数是正数,故为0(负数为1)。

    阶码 : 阶码的计算公式:阶数 + 偏移量, 阶码是需要作移码运算,在转换出来的二进制数里,阶数是111(十进制为7),对于单精度的浮点数,偏移值为01111111(127)[偏移量的计算是:2^(e-1)-1, e为阶码的位数,即为8,因此偏移值是127],即:111+01111111 = 10000110=134(10进制)

    尾数:小数点后面的数,即0110010001

    最终根据位置填到对位的位置上:

    f430d624fe04bd31cdf2add3ddf2b162.png

    可能有个疑问:小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是“1”,所以这是直接隐藏掉,同时也节省了1个位出来存储小数,提高精度。

    输出浮点数二进制位的代码:

    利用共用体,不同类型共用一段内存空间,可以实现同样的一段0、1串可以不加改变地(不考虑类型转换规则)按不同的类型解释输出。如在共用体中存储一个float型和一个int型,如果先输入float的变量值,则可用int型按原样的比特串输出,如果先输入的是一个int型的变量值,则可用float型按原样的比特串输出。

    #include using namespace std;union {float input;int output;} data;void main(){data.input = 178.125;int h=1;h=h<<31;for(int i=1;i<=32;i++){if((data.output&h)==0)cout<<0;else cout<<1;data.output<<=1;if(i%4==0)cout<

    把上面的代码写到一起:

    #include using namespace std;union {float input;int output;} data;char flag;void printbin1(int val){int len=sizeof(val)*8;for(int i=1;i<=len;++i){if(val&(1<
    展开全文
  • 书上是这样说的:正数的补码是本身,负数的补码是按取反再加一 首先通过一个例子引出话题: #include <stdio.h> int main() { char c = 255; //11111111 int a = 255; //00000000 00000000 00000000 ...
  • 运算-补码范围

    2011-10-08 22:04:36
    范围是 -128至127. 根据补码的几条规定即可推出上述结论: 1 若二进制每全为0,则表示数0 2 若最高(即符号)为0,表示正数 3 若最高为1, 表示是负数,而该负数的绝对值是多少呢?将每个二进制(包括符号...
  • 想要在一个16补码中无视多余,找出可以表示该带符号整数二进制补码的最少位数,我们需要的运用到C语言中一个非常有用的算法思想——拆半查找。 拆半查找: 搜索过程从数组的中间元素开始,如果中间元素正好是...
  • 原码、反码、补码的表示范围是如何得到的原码纯整数的原码纯小数的原码反码纯整数的反码纯小数的反码补码整数补码纯小数的补码原码首先说原码,原码是有符号数中最简单的编码方式。原码表示法在数值前面增加了一...
  • 8位有符号数的补码表示范围

    万次阅读 多人点赞 2017-07-15 22:48:07
    范围是 -128至127. 根据补码的几条规定即可推出上述结论: 1 若二进制每全为0,则表示数0 2 若最高(即符号)为0,表示正数 3 若最高为1, 表示是负数,而该负数的绝对值是多少呢?将每个二进制(包括符号...
  • 一个Long类,用于表示从派生的64二进制补码整数值,供独立使用并在无符号支持下扩展。 背景 从,“数值类型中可表示幅度不大于2 53的所有正整数和负整数”,即“代表IEEE标准中指定的双精度64格式IEEE 754值二...
  • 在java虚拟机规范中定义的整数类型有byte(8位),short(16),int(32),long(64),它们都是有符号整数,即最高为符号。这些整数JVM中使用补码来表示. 那么我们首先来了解一下原码,反码和补码. 1. 原码 符号...
  • 符号可以和数值为一起参加运算,比如俩个负数相加,只要结果在范围内,则可直接按相加,这是原码做不到的(原码符号相加会出错)。 由于其模运算的特性,补码可以直接利用加法的形式计算整数间的减法,既省时...
  • 最大+127,最小 -128补码表示的数,是没有正负0的,因此除了最高的符号以外,可以表示的数最大为 127,因此最大为 +127 而因为 10000000,并不是表示为 -0 因此人家用 1000000表示 -128 转载于:...
  • 在java虚拟机规范中定义的整数类型有byte(8位),short(16),int(32),long(64),它们都是有符号整数,即最高为符号。这些整数JVM中使用补码来表示. 那么我们首先来了解一下原码,反码和补码. 原码、反码、补码...
  • 整数在计算机内部的表达 众所周知 在计算机的内部 一切都是二进制 18转换为二进制是00010010 0转换为二进制是00000000 那么 负数该如何表达 在十进制中 负数用-来表示 在十进制的带有负号的运算中 会先进行数字的...
  • 以一个字节(8位)编码为例,如果采用补码,则表示的整数(有符号数)范围是[-128,127]。 如果把该二进制编码表示为十进制,则8位编码对应的十进制为0-255,(或者说表示为无符号数就是0-255) 其中[0-127]表示正...
  • 在一个8位的二进制的机器中,补码表示的整数范围是从_(1)_ (小)到 _ (2) _ (大)。这两个数在机器中的补码表示为 _ (3) _ (小)到 _ (4) _ (大)。数0的补码为_(5)_。 分析过程 在8位字长的机器中,补码:第一表示...
  • 二进制补码范围简单总结

    千次阅读 2013-09-07 20:38:24
    8位补码范围是 -128至127. 根据补码的几条规定即可推出上述结论: 1 若二进制每全为0,则表示数0 2 若最高(即符号)为0,表示正数 3 若最高为1, 表示是负数,而该负数的绝对值是多少呢?将每个二进制(包括...
  • 最常见的有符号数的计算机表示方式就是补码,最高为符号。 原码表示 在看补码之前先复习一下原码 decimal binary decimal binary 0 0000 -0 1000 1 0001 -1 1001 2 0010 -2 1010 3 0011 -3 1011 ...
  • 首先解释16位整数:所谓16位整数就是16个二进制(16#7FFF)而对应的最大整数为32767;PLC中是用二进制的补码来表示有符号数的,定义最高为符号;当最高位位0时为正;最高为1时为负;所以经过换算就是-701;...
  • 补码

    2018-11-02 11:49:24
    整数补码 编辑 求给定数值的补码分以下两种情况: 正数 正整数的补码是其二进制表示,与原码相同 [2] 。 【例1】+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16...
  • //解释1原来始终对正数/负数的补码...一个字节的表示范围为00000000-11111111,由此可见一个字节的unsigned整数表示范围为[0,255=2^8 - 1]. 对于signed整数来讲,其二进制表示中存在一个符号.先来看一下下面几个定义:
  • 补码无符号数

    2019-03-13 10:15:47
    w位补码数存储范围: -2(w - 1) ~ 2(w - 1) - 1 补码转无符号数: x > 0 时 X补码即是无符号编码 x < 0时 X补码转无符号数为x + 2(w) 无符号数转补码: 当u =< TMax,w 无符号u即是补码 当u > TMax,w ...
  • 最高为符号,用0表示正数,用1表示负数。比如: 0, 0000 0000 +1, 0000 0001 +2, 0000 0010 +3, 0000 0011 +4, 0000 0100 -1 1000 0001 -2 1000 0010 -3 1000 0011 -4 1000 010...
  • 有符号整、小数的原、反、补码表示范围,及补码比原、反码多表示一的原因。计算机组成原理学习笔记。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,265
精华内容 9,706
关键字:

8位整数补码范围