计算机原码反码补码问题和进制转换

2025-03-24 17:49:57
推荐回答(2个)
回答1:

1首先了解 低字节位 和高字节位 看图

2字节在内存的排列方式

//int num = 010; //0开头代表 8禁止 //("%d",num); //所以打印的是8 int num = 0x12345678; //将占 2 32位 printf("%p", &num); /* 要特别 注意 低位 在低字节 高位 高字节 0x0063FAC0 78 x 0x0063FAC1 56 V 0x0063FAC2 34 4 0x0063FAC3 12 . */ 看图2

3 printf  不会进行自动转换 void main(){ printf("%d", 10.3); printf("\n%f", 10);

getchar();}

请看图3

4 一定要注意数据会溢出数据会溢出请看图4

unsigned short num = 65535; printf("我有现金:%d元",num);

unsigned short num = 65535+1; printf("我有现金:%d元",num);

上面这样数据就会溢出

5 原理

头文件#include printf("%d", INT_MAX); printf("\n%d", INT_MIN); printf("\n%u", UINT_MAX); //有负号的情况下 0代表正式 1代表负数 //1111 1111 1111 1111 1111 1111 1111 1111 //0111 1111 1111 1111 1111 1111 1111 1111

6源码反码补码

//1的源码和-1的源码 //0000 0000 0000 0000 0000 0000 0000 0001 //1000 0000 0000 0000 0000 0000 0000 0001//-1符号为是1

源码反码补码过程//源码1000 0000 0000 0000 0000 0000 0000 0001

//-1反码1 符号位不变  所有0变1  1变0//111 1111 1111 1111 1111 1111 1111 1110

//-1补码  符号位不变  所有0变1  1变0  在补1(在反码基础是+1)//111 1111 1111 1111 1111 1111 1111 1111 unsigned int num = -1; printf("%d %u", num, num);

虽然补码后二进制相同 但是他们有负号的符号位不算 所以数据不相同

7为什么要用补码  非常重要!!!

0000 0001  1   (1代表十进制)1000 0010  2   (1000 0010 是2的源码)

如果我们用2的补码1000 0010  源码

1111 1101  反码(所有位取反 负号不变)

1111 1110  补码(反码基础 +1)

这时候在相加

0000 0001  1 1111 1110  2的补码1111 1111  是不是就是-1

-1 源码1000 00011111 1110 反码1111 1111 补码用补码的原因就是因为可以大大节约计算机的资源

8 数据的取值范围

回答2:

国标码 5E38,机内码就是:DEB8。