PX-25-原码反码补码
1.原码补码反码
2.原码
0000 0111 +7
1000 0111 -7 原码 第一位0代表正数,1代表负数,第一位符号位 87
3.反码
0000 0111 +7反码正数与原码一样
1111 1000 -7 F8
4.补码
0000 0111 +7 反码正数与原码一样
1111 1000 -7 对反码加一, F8
5.计算补码
int num = -1; // 0000 0000 0000 0000 0000 0000 0000 0001 +1原码 // 1000 0000 0000 0000 0000 0000 0000 0001 -1原码 // 1111 1111 1111 1111 1111 1111 1111 1110 -1 反码 // 1111 1111 1111 1111 1111 1111 1111 1111 -1 补码
计算方法:
原码,反码,补码,正数都是一样的
负数,原码取反(不包含符号位)+1=补码
-----
无符号没有符号位,统一处理为数据
有符号,第一位是符号位
void main3() { int num = -1; // 0000 0000 0000 0000 0000 0000 0000 0001 +1原码 // 1000 0000 0000 0000 0000 0000 0000 0001 -1原码 // 1111 1111 1111 1111 1111 1111 1111 1110 -1 反码 // 1111 1111 1111 1111 1111 1111 1111 1111 -1 补码 printf("%d", num); // -1 printf("\n%u", num); // 4294967295 getchar(); }
6.原码补码的比较
为什么用补码?时钟 一一映射三点到六点 前拨3小时 倒着拨9小时都是一样的
0000 0111 +7 原码的加法 1000 0001 -1 000 0110 +6 取绝对值,去掉符号位 比较大小,减法 ,加上符号位 1000 1001 -9 0000 0111 +7 1000 0010 -2 取绝对值 , 去掉符号位 ,9-7,减法 1000 0001 -1原码 1111 1110- 1反码 1111 1111 -1补码 0000 0111 +7 1111 1111 -1 0000 0110 +6 1000 1001 -9原码 1111 0110 -9反码 1111 0111 -9补码 0000 0111 +7 1111 0111 -9 111 1111 1110 补码-2 1000 0001 反码 1000 0010 原码 -2
7.int 的最大值
1111 1111 1111 1111 1111 1111 1111 1111 4294967295 无符号 2^32-1
0000 0000 0000 0000 0000 0000 0000 0000 0
0111 1111 1111 1111 1111 1111 1111 1111 有符号的最大值 2^31
1111 1111 1111 1111 1111 1111 1111 1111 有符号的最小值 - (2^31+1)
代码:
#include<stdio.h> #include<limits.h> void main1() { unsigned int num = -1; //1111111111111111111111111111 printf("%u", num); for (int i = 0; i < num; i++) //循环10次 { printf("你好天朝"); } } void main2() { char ch = -17; //计算机都是补码存储,手机,电脑,服务器补码 //0001 0001 +17原码 //1001 0001 -17原码 //1110 1110 -17反码 //1110 1111 -17 补码 EF printf("%p", &ch); getchar(); } void main3() { int num = -1; // 0000 0000 0000 0000 0000 0000 0000 0001 +1原码 // 1000 0000 0000 0000 0000 0000 0000 0001 -1原码 // 1111 1111 1111 1111 1111 1111 1111 1110 -1 反码 // 1111 1111 1111 1111 1111 1111 1111 1111 -1 补码 printf("%d", num); printf("\n%u", num); getchar(); } void main4() { printf("%d,%d", INT_MAX, INT_MIN); getchar(); } void main() { int num = -1; unsigned int data = 4294967295u;//无符号数据 111111全部都是数据 int num1 = 4294967295u; //32个1 unsigned int data1 = -1; printf("%d", num); // -1 printf("\n%u", num); //4294967295 printf("\n%d", num1); // -1 printf("\n%u", num1); // 4294967295 printf("\n%u", data); //4294967295 printf("\n%d", data); //-1 printf("\n%u", data1); //4294967295 printf("\n%d", data1); //-1 printf("\n%f", 1); //printf,不管三七二十一,抓取二进制数据就解析 getchar(); } void main7() { //printf("%d,%d", INT_MAX, INT_MIN); //printf("\n%d,%d", INT_MAX+1, INT_MIN); //%d显示范围 INT_MAX, INT_MIN 补码 //printf("\n%d,%d", INT_MAX , INT_MIN-1); printf("%u,%u", UINT_MAX, 0); printf("\n%u,%u", UINT_MAX+1, 0);//%u显示范围 0-UINTMAX printf("\n%u,%u", UINT_MAX + 1, -1); //溢出 , 补码 getchar(); }