补码原理

匿名 (未验证) 提交于 2019-12-02 23:49:02
//嵌入式开发需要了解补码#include<stdio.h>  void main(){ 	 	int a = -1;  //-1 在int 范围内,赋值实际上是赋的内存地址中二进制的值 	printf("%x\n",&a);  //&a的内存地址是0x0018FA88通过改地址找到内存中的值是ff ff ff ff 	/* -1 内存中的值为 ff ff ff ff  		-1的补码二进制为:1111 1111  1111 1111 1111 1111 1111 1111 		-1的反码二进制为:1111 1111  1111 1111 1111 1111 1111 1110    -1 		-1的原码二进制为:1000 0000  0000 000  0000 0000 0000 0001   取反 	*/ 	printf("%d,%u\n",a,a); //output: -1,4294967295 	/*%d按照有符号的十进制输出,-1在[-2^15,2^15-1]内,内存中二进制的补码值为1111 1111  1111 1111 1111 1111 1111 1111, 	首位1代表符号位,求出其原码,1000 0000  0000 000  0000 0000 0000 0001,输出-1, 	%u按照无符号的十进制输出,-1不在[0,2^32-1]内,但-1的内存中二进制的补码值为1111 1111  1111 1111 1111 1111 1111 1111 	无符号位,正数的原码与补码一样,求出其原码 1111 1111  1111 1111 1111 1111 1111 1111,输出4294967295,*/   	int b = 4294967295;  //4294967295不在int范围内,直接把二进制赋值给b,有系统声明的变量去做解析和解释 	//4294967295的二进制形式为:1111 1111  1111 1111 1111 1111 1111 1111    //把上面的二进制直接赋值给b,printf()函数的本质是按照指定格式%d或%u输出二进制的值,不管二进制是什么数 	//%d按照有符号的十进制整数去解析输出就是-1,%u按照无符号十进制的整数输出4294967295 	printf("%d,%u\n", b, b); //output: -1,4294967295  	unsigned int c = -1;  //-1 不在unsigned int 范围内 	unsigned int d = 4294967295; // 4294967295在unsigned int 范围内 	/* 数据复制本质上是二进制的赋值,数据范围内保证正确,数据范围外不保证正确 	4294967295的内存中的二进制形式为:1111 1111  1111 1111 1111 1111 1111 1111 		 -1        内存中的二进制形式为:1111 1111  1111 1111 1111 1111 1111 1111 	两个数在内存中存储的二进制是一样的,在程序运行时,按照各自声明的变量进行解析 	c尽管是无符号整型,没有负数,但按%d有符号解析,32位1转换成原码就是-1,输出-1 							按%u解析,也是无符号的,32位都是数据位,输出4294967295 	d尽管是无符号整型,没有负数,但是按%d有符号解析,32位1转换成原码就是-1,输出-1 							按%u解析,也是无符号的,32位都是数据位,输出4294967295 	*/ 	printf("%d,%u\n", c ,c);//output: -1,4294967295 	printf("%d,%u\n", d, d);//output: -1,4294967295   	//以下内容没有搞懂,以后再看 	int e = 217483648;   //217483648 不在int范围内 	/*2147483647的内存中的二进制形式为:0111 1111  1111 1111 1111 1111 1111 1111 最大值 	  2147483648的内存中的二进制形式为:1000 0000  0000 0000  0000 0000 0000 0000 	  1、%d解析 	补码  2147483648的内存中的二进制形式为:1000 0000  0000 0000  0000 0000 0000 0000  也就是补码 首位1表示该数是负数 	 反码 2147483648的内存中的二进制形式为:1111 1111  1111 1111  1111 1111 1111 1111 减去1,符号位不变 首位1表示该数是负数 	 原码  2147483648的内存中的二进制形式为:1000 0000  0000 0000  0000 0000 0000 0000  取反 符号位不变 首位1表示该数是负数 	*/ 	printf("%d,%u\n", e, e);//output:-2147483648,2147483648 	int f = -217483648;   //-217483648 不在int范围内 	printf("%d,%u\n", f, f);//output:-217483648, 4077483648 	/* 	J结论:赋值和解析是分开的,赋值是赋二进制的值,解析按照%d,%u去解析 	*/ 	getchar();  } 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!