您的位置:首页 > 编程语言 > C语言/C++

c/c++原码反码补码原理 以及进制转换

2016-12-03 18:52 393 查看
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<limits.h>
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 0001
1111 1110 反码
1111 1111 补码
用补码的原因就是因为可以大大节约计算机的资源

8 数据的取值范围


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制 include c/c++