精华内容
下载资源
问答
  • 当两位符号位 为 01, 10时就是溢出,这时取最高位为符号位,其他位为数值位 */ #include<bits/stdc++.h> using namespace std; int binary_x[6]; int binary_y[6]; void BaseConversion(int n, int b, ...

     

    代码:

    /*
    	用两个符号位进行修正
    	正数符号位为 00 , 负数符号位为 11
    	当两位符号位 为 01, 10时就是溢出,这时取最高位为符号位,其他位为数值位 
    */  
    #include<bits/stdc++.h>
    using namespace std;
    int binary_x[6];
    int binary_y[6]; 
    void BaseConversion(int n, int b, int base[]) {	//10进制转换为2进制并求补码 
    	if(n != -16) {
    		int q = 5;
    		bool flag = 0;
    		if(n >= 0) flag = 0;	//表示这个数是正数 
    		else {
    			flag = 1;	//表示这个数是负数 
    			n = -n;
    		}
    		//然后根据[n]补 求[-n]补 : 连同符号位按位取反末尾 + 1 
    		//先求 [x] 原码 
    		while (n) {
    			int temp = n % b;
    			base[q--] = temp;
    			n /= b;
    		}
    		/*
    		//输出原码 
    		for(int i = 0; i < 6; ++i) cout << base[i];
    		cout << endl;
    		*/
    		//求[n] 的补码 和[-n] 的补码
    		//正数原反补相同 
    		if (flag) {  //负数求补码 
    			//连同符号位按位取反 
    			for(int i = 0; i < 6; ++i){
    				base[i] = !base[i];	
    			} 
    			//末尾 + 1 
    			int temp = 1; //判断是否进位 
    			for(int i = 5; i > 0; --i) {
    				if (base[i] == 1 && temp == 1) {	//当前相加有进位 
    					base[i] = 0;
    					temp = 1; 
    				} else {	//当前位为0 或者进位为0 
    					base[i] = 1; 
    					temp = 0;
    					break;
    				} 
    			}
    		} 
    	} else {	//负16的情况 
    		base[0] = base[1] = 1;
    		for (int i = 2; i < 6; ++i) {
    			base[i] = 0;
    		} 
    	}
    	//输出补码
    	for(int i = 0; i < 6; ++i){
    		cout << base[i];	
    	} 
    	cout << endl; 
    } 
    int BtoD (int ans[]) { //二进制转10进制 
    	int temp = 0;
    	for (int i = 1; i < 6; ++i) {
    		if (ans[i]) {
    			temp += pow(2, 6 - i - 1);
    		}
    	}
    	return temp;
    }
    void Solve(int binary_x[], int binary_y[]){
    	int temp = 0; //判断是否进位 
    	int ans[6];
    	memset(ans, 0, sizeof(ans));
    	for(int i = 5; i >= 0; --i) {
    		if (binary_x[i] && !(binary_x[i] ^ binary_y[i])) { //两位都为1 
    			if (temp) { //上一位+法有进位 
    				ans[i] = 1;  
    			} else {
    				ans[i] = 0;
    			}
    			temp = 1;
    		} else if (binary_x[i] ^ binary_y[i]) {	//异或结果为 1 其中有一位为1 
    			if (temp) {//上一位+之后 ,有进位 
    				ans[i] = 0; 
    				temp = 1;
    			} else {
    				ans[i] = 1;
    			}
    		} else { //两都为0 
    			if (temp) {//上一位+之后,有进位 
    				ans[i] = 1; 
    			} else {
    				ans[i] = 0;
    			}
    			temp = 0;
    		} 
    	} 
    	//判断 最高位是否是 01 或者 10
    	int flag = ans[0] ^ ans[1];
    	if (flag) cout << "计算结果溢出。" << endl;
    	else cout << "计算结果没有溢出。" << endl;
    	/*
    	//输出结果的补码 
    	for (int i = 0; i < 6; ++i) cout << ans[i];
    	cout << endl;
    	*/
    	/*
    	没有溢出 那答案是什么
    	溢出之后的修正, 最高位为符号位, 其他为数值位
    	没有溢出和溢出求解都可以看做 ,最高位为符号位,其他为数值位
    	思路:
    		1)先判断符号位,
    		2)然后 从右往左找第一个1,包括这个1在内的所有都是原码部分 (i - n) 
    		3)第一个1的左边除了符号位按位取反(i-1位按位取反) 
    	*/ 
    	int result = 0;
    	flag = 0;
    	if( ans[0] ) {	//负数 
    		//求原码
    		for(int i = 5; i > 0; --i) {
    			if(ans[i] == 1 && !flag) { //从右到左找第一个1 
    				flag = 1;
    			} 
    			else if(flag == 1) { //按位取反 (除符号位) 
    				ans[i] = !ans[i];
    			}
    		}
    		/*
    		//输出结果的原码 
    		for (int i = 0; i < 6; ++i) cout << ans[i];
    		cout << endl;
    		*/
    		flag = 0; //判断一下是否是 -32 
    		for(int i = 1; i < 6; ++i){
    			if(ans[i]) {
    				flag = 1;
    				break;
    			}
    		} 
    		if (!flag) {
    			result = -32;
    		}
    		else {
    			result = -BtoD(ans);	//二进制转换为10进制 
    		}
    	} else {	//正数 
    		result = BtoD(ans);
    	}
    	cout << result << endl;
    }
    
    int main () {
    	//输入 2 个10进制数 范围在 -2^4 ~ 2^4 -1 (-16 ~ +15) 
    	while(1) {
    		int x, y;
    		cin >> x >> y;
    		if(x < -16 || x > 15 || y < -16 || y > 15) {
    			//cout << "请输入正确范围的数字" << endl;
    		} else {
    			memset(binary_x, 0, sizeof(binary_x));
    			memset(binary_y, 0, sizeof(binary_y));
    			cout << x << " 的补码为 :" << endl;
    			BaseConversion(x, 2, binary_x);
    				
    			cout << y << " 的补码为 :" << endl;
    			BaseConversion(y, 2, binary_y);
    			//然后补码进行向+判断是否会溢出 和 修正	
    			Solve(binary_x, binary_y);
    		} 
    	}
    	
    	return 0;
    } 
    
    /* 
    
    */

    测试数据集:自己跑一个 从 -17 到 +17的所有排列 

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
    	freopen("out.txt", "w", stdout);
    	int arr[100];
    	int q = -17;
    	for(int i = 0; i <= 34; ++i){
    		arr[i] = q++;
    	} 
    	for(int i = 0; i <= 34; ++i) {
    		for (int j = 0; j <= 34; ++j) {
    			cout << arr[i] << " " << arr[j] << endl;
    		} 
    	}
    	
    	return 0;
    } 

     

    展开全文
  • 补码与符号位

    千次阅读 2020-12-02 11:12:27
    补码与符号位 计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,1是负数,0是正数。 规定:正数的补码与反码、原码一样,称为三码合一; ​ 负数的补码与反码、原码不一样: ​ 负数的原码:把十进制...

    补码与符号位

    计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,1是负数,0是正数。

    规定:正数的补码与反码、原码一样,称为三码合一;

    负数的补码与反码、原码不一样:

    负数的原码:把十进制转为二进制,然后最高位设置为1

    负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)

    负数的补码:反码+1

    例如:byte类型(1个字节,8位)

    25 ==> 原码 0001 1001 ==> 反码 0001 1001 -->补码 0001 1001

    -25 ==>原码 1001 1001 ==> 反码1110 0110 ==>补码 1110 0111

    底层是用加法代替减法:-128==》-127-1==》-127+(-1)

    ​ -127- -1 ==> -127 + 1
    用补码加减

    展开全文
  • 有符号数据的符号位扩展

    千次阅读 2017-08-03 20:36:04
    所以我们需要对数据做符号位扩展。使用例子:比如说现在有一个输出为12位的加速度计数据,最高位表示数据符号位。现在读取X轴的数据(两个8位寄存器)如下:所以我们需要一个16位有符号变量来存储X轴的数据,现定义...

    简介:

    在写传感器驱动程序的时候经常会遇到输出数据位数在8到16位之间。这样,在调试的时候如果使用printf直接输出数据,有可能出现错误。因为printf在打印的时候会做数据类型判断。所以我们需要对数据做符号位扩展。

    使用例子:

    比如说现在有一个输出为12位的加速度计数据,最高位表示数据符号位。现在读取X轴的数据(两个8位寄存器)如下:

    所以我们需要一个16位有符号变量来存储X轴的数据,现定义一个 int16_t data_x = 0;且data_x = ((OUT_X_MSB << 4) | (OUT_X_LSB >> 4));因为我们定义的时候data_x是一个16位数据,而加速度计实际有效数据是12位,所以data_x的高4位是伪数据。这是就需要进行符号位扩展了。
    具体操作如下:
    if(printf_datax & (1 << 11))   // 12位有符号数据需要左移11
    {
    printf_datax |= 0xf000;
    }
    上面的操作是对有符号数据进行符号扩展的操作,通过给负数值“或1”实现的。或1的位域是除了有效数据之外的所有位域。

    展开全文
  • JavaScript 符号位、指数位、尾数位

    千次阅读 2019-05-23 13:01:24
    所有数字以二进制存储,每个数字对应的二进制分为三段:符号位、指数位、尾数位。 用于存储的二进制有 64 位,其中符号位在六十四位的第一位,0 表示正数,1 表示负数。符号位之后的 11 位是指数位,决定了数字的...

    1. JavaScript中数字的存储标准是 IEEE754 浮点数标准。代码中使用的无论是整数还是小数,都是同一种数据类型——64 位双精度浮点型

    所有数字以二进制存储,每个数字对应的二进制分为三段:符号位、指数位、尾数位。

    用于存储的二进制有 64 位,其中符号位在六十四位的第一位,0 表示正数,1 表示负数。符号位之后的 11 位是指数位,决定了数字的范围。指数位之后的 52 位是尾数位,决定了数字的精度。

    2. 在 JavaScript 中,双精度浮点型的数转化成二进制的数保存,读取时根据指数位和尾数位的值转化成双精度浮点数。

    比如说存储 8.8125 这个数,它的整数部分的二进制是 1000,小数部分的二进制是 1101。这两部分连起来是 1000.1101,但是存储到内存中小数点会消失,因为计算机只能存储 0 和 1。

    1000.1101 这个二进制数用科学计数法表示是 1.0001101 * 2^3,这里的 3 (二进制是 0011)即为指数。

    现在我们很容易判断符号位是 0,尾数位就是科学计数法的小数部分 0001101。指数位用来存储科学计数法的指数,此处为 3。指数位有正负,11 位指数位表示的指数范围是 -1023~1024,所以指数 3 的指数位存储为 1026(3 + 1023)。

    可以判断 JavaScript 数值的最大值为 53 位二进制的最大值: 2^53 -1。

    PS:科学计数法中小数点前的 1 可以省略,因为这一位永远是 1。0.5 二进制科学计数为 1.00 * 2^-1。

    3. 最后来说一下浮点数精度的问题。很多人都知道,两个浮点数相加时,结果会有一些误差。比如 0.1 + 0.2 的结果是 0.30000000000000004。

    这是因为 0.1 和 0.2 用二进制表示时为 0.0001 1001 1001 1001...(1100循环) 和 0.0011 0011 0011 0011...(0011循环)。如果截取于第 52 位,就会得到一个有误差的结果。

    展开全文
  • 关于双符号位的溢出问题

    千次阅读 2019-11-17 10:24:33
    符号位表示正数是00,负数是11,因为采用了两位符号位,肯定多了信息,实际上是可一将第二位符号位看做原来单符号位表示法里的符号位。 1.单符号位判断溢出 方法:判断符号进位位Cs和最高数位进位位C1,相同则没有...
  • 符号位扩展,数据截断

    千次阅读 2015-05-29 23:43:18
    符号位扩展
  • 软考--双符号位判决法

    万次阅读 多人点赞 2018-06-29 11:01:58
    一、判断方式计算机运算溢出检测机制,采用双符号位,00表示正号,11表示负号。如果进位将会导致符号位不一致,从而检测出溢出。结果的符号位为01时,称为上溢;为10时,称为下溢。二、典型案例例如设X = + ...
  • 为什么计算机中数字符号位0表示正数,1表示负数

    万次阅读 多人点赞 2019-03-09 21:09:50
    只知道书本上说是有一个符号位,当该符号位为0时,表示的是正数,为1时表示负数。我那时没搞懂为什么这样规定,我觉得1么,代表正数挺合理的,那么0就自然表示负数咯,所以不解,只能死记硬背:0正1负。   我个人...
  • C语言中获取整数和浮点数的符号位

    千次阅读 2015-03-19 19:05:51
    1. 为什么要获得符号位 很多时候,我们需要判断数值的正负,来做相应的逻辑处理。条件判断语句可以很好的完成这个需求。有时候会有下面的情况, if (x > 0) { x = x - 1; } else { x = 1 - x; } if (x ) { x ...
  • 符号位数的运算

    千次阅读 2018-03-02 17:41:15
    无符号数:最高位不用来表示正负,它没有负数,比如,4位无符号数表示的范围,0000-1111,大小即0-15,有符号数:最高位用来表示正负原码反码补码 0正1负数 最高位永远是符号位 当二进制为正数时,原码、反码、...
  • 如何去除十六进制的符号位?例如0x88888888取出符号为1。用C语言实现位的操作
  • mips符号位扩展和无符号位扩展

    千次阅读 2018-05-03 18:22:38
    MIPS32 指令集架构中,经常会有指令需要将其中的立即数进行符号扩展,或者无符号扩展,一般都是都是将n立即数扩展为32。无符号扩展:直接将扩展后的数据的高(32-n)位置为0。符号扩展:将扩展后的数据的高(32-n)...
  • 二、有符号位乘法符号位扩展原理 三、Verilog设计 文介绍了基4 Booth乘法器,并且设计了具有基本功能的Booth乘法器,其中在文末留下了几个有待优化的问题,本文将优化“生成部分和”与“符号位扩展”两部分,参考...
  • 首先让我们看一下SF到底是什么? SF(sign flag)符号位:当运算结果为负时,SF置1,记为NG(negative),为正时清零记为NZ(Non Zero). 那么我看这段说明简直就是一点用处...我们把最高位定义为符号位符号位为0,该...
  • 众所周知,每种基本数据类型都有一个固定的位数,比如byte占8...(2)补符号位扩展:填充一定位数的符号位(非负数填充0,负数填充1)。 对于无符号类型(相当于都是非负数)与有符号类型中的非负数部分,这两种方法...
  • 原码,反码,补码,移码的意思 以及它们之间的相互转化符号位有无的区别: 有符号位与无符号位最明显的区别就是二者的表示范围不同。 (无符号数: 0 ----------------- 255 、有符号数: -128 --------- 0 --------...
  • 原因是有符号数中的最高被挪去表示符号了。并且,我们知道,最高的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一,最大值一下子减半。 不过,有符号数的长处是它可以表示负数。因此,...
  • 根据浮点数规格化,小数点右移动,直到小数点后一位不为0,所以规格化后的浮点数尾数最高有效位一定为1,而有补码规可知规格化浮点数尾数的补码最高有效位与符号位相反...
  • 符号位的修正算法 思路: 1)不溢出就不修正 2)溢出就修正 判断溢出原理:数值最高位和符号最高位是否进位 a)都进位,不溢出 b)只有其中一个进位,则溢出 根据溢出来修正 1) 只有符号位...
  • php有符号位(负数)左移, 符号位会变化吗? 谢谢!-------------------------------------
  • C++中的移位运算符>,移位的效果不是循环移位(如果需要,可用位与、位或人为实现循环移位),其他位数据会丢失。 #include #include ...如果是带符号的,类型转换时会自动扩展符号位;  // 如
  • [例] 已知不带符号的二...不带符号位的阵列乘法器逻辑电路图如下: 不带符号位的阵列乘法器的计算过程如下图: 注: 不带符号位的阵列乘法器在计算时有两个延迟计算,一个是部分积的最高位,另一个是进位位。 ...
  • Java中byte的符号位

    千次阅读 2013-05-19 11:16:56
    而这样对于一些I/O处理程序来说需要对考虑符号位问题,通常的做法可能是:  int unsignedByte = signedByte >=0 ? signedByte : signedByte + 256;  这里我们发现,由于byte的符号位的关系,我们不得
  • 二进制中的符号位的区分以及表示

    千次阅读 2018-05-23 13:27:00
    问题1:  二进制中的表数范围是怎么得来的? 无符号是0-255;...而如果表示带符号数,则最高位就是符号位,0表示"+",1表示"-",剩下的7位用来表示绝对(采用补码形式).0用"+0"表示,正数为+1~+127,负数为-1~-1...
  • 关于整型数据符号位扩展的问题

    千次阅读 2013-07-22 11:30:10
    关于符号扩展的问题,我们大家读到最多的一句关于符号扩展规律就是“对于无符号整型数据,要扩展成符号位的话,就是将扩展位补零,其他位保持不变。但对于有符号整型数据的符号扩展规律就是:原来符号位为1时,符号...
  • 对于无符号数以及有符号数值左移效果一致,如: //默认i为32 int i = 1; //i = 0000 0000 0000 0000 0000 0000 0000 0001 i = i << 31;//i = 1000 0000 0000 0000 0000 0000 0000 0000, i = -2147483648 ...
  • 今天看了《逻辑设计基础》才明白了为什么二进制负数的补码是符号位不变,其他位取反加一 1. 什么是补码? 补码:计算机是用来将减法转换成加法的一种手段,在计算机系统中,数值一律用补码来表示和存储。 2. 如何...
  • 符号位为1的二进制转十进制负数

    千次阅读 2016-05-03 13:23:32
    2、符号位为1的二进制转十进制负数  相信大家已经知道如何个转法了,不过在此还是说明一下。  ①除去符号位减1;  ②除去符号位,按位取反;结果就是负数的源码;  ③源码转成相应的十进制。  ...
  • 关于整型数据符号位扩展的问题 .

    千次阅读 2012-12-10 09:58:40
    关于符号扩展的问题,我们大家读到最多的一句关于符号扩展规律就是“对于无符号整型数据,要扩展成符号位的话,就是将扩展位补零,其他位保持不变。但对于有符号整型数据的符号扩展规律就是:原来符号位为1时,符号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 690,794
精华内容 276,317
关键字:

符号位