//嵌入式开发需要了解补码#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(); }