c/c++原码反码补码原理 以及进制转换
2016-12-03 18:52
393 查看
1首先了解 低字节位 和高字节位 看图
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 原理
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 数据的取值范围
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 数据的取值范围
相关文章推荐
- Java原码、反码和补码的算法,Java跨平台原理,以及JDK安装目录说明
- 进制转换以及原码、反码、补码
- 位运算以及原码反码补码的介绍和案例
- C/C++:原码、反码和补码
- 二进制原码,反码以及补码实战
- Java之&0xff用法解析以及原码、反码、补码相关知识
- 让我细细捋一捋原码反码补码以及计算机中负数的表示
- 关于计算机数字表示原理的研究(原码,反码,补码)
- 关于原码反码补码以及位元算
- 原码补码反码以及位运算符
- C-01 4000 8.二进制中的原码、反码和补码以及负数如何转二进制?
- memset的使用以及原码反码补码.md
- 原码,反码,补码以及作用
- 原码反码和补码以及Java中数据溢出问题
- java学习总结(06,05.16)计算机对数据的储存方式以及原码反码补码的概念
- 计算机机器数原码、反码、补码、有符号数以及无符号数
- 正负数的原码、反码以及补码
- 原码、反码、补码以及为什么要用反码和补码
- 原码反码补码以及移位按位与或异或等位操作的实例
- JAVA基础学习总结---原码、补码、反码以及基本数据类型