文章目录
前言
补码是计算机底层知识中非常重要的一部分,而进制转换是学习补码的基础,基础的进制转换知识我在《C语言之进制转换》这篇文章中详细阐述过,有兴趣的朋友可以一看。
一、学习目标
- 已知一个整数对应的二进制数字,求出对应的十进制数字
- 求int类型的变量所能存储的整数范围
- 求int类型的整数中最小负数与最大正数的二进制数字
- 如果超过某个类型变量所能存储的整数范围会出现什么情况
二、十进制转二进制
1.正整数转二进制
方法:除2取余,直至商为0,后将余数倒叙排列,如果位数不够,则在左边补0凑齐位数。详细内容见 《C语言之进制转换》,这里不再赘述
2.负整数转二进制
方法:先求与该负整数相对应的正整数的二进制数字,然后将所有位取反,并在末尾加1,如果位数不够,则在左边补1凑齐位数
示例:求十进制数字-3对应的的二进制数字
- 求出3的二进制数字为11
- 将求出的11取反变为00
- 在00末尾加1,变为01
- 如果我们定义-3为int类型的变量,则-3占四个字节,四个字节是32位,而01只有两位,所以需要在01前再补30个1,即,十进制数字-3对应的二进制数字为1111, 1111, 1111, 1111, 1111, 1111, 1111, 1101。同理,如果我们定义-3为short类型的变量,则-3占两个字节,两个字节是16位,而01只有两位,所以需要在01前再补14个1,即,十进制数字-3对应的二进制数字为1111, 1111, 1111, 1101。同理,如果我们定义-3为long int类型的变量,则需要在01前再补62个1,因为long类型的变量占八个字节。
注意:我们在后面的转换过程中均以四个字节为例,即,所有的数字的类型都是int类型
十进制数字-3转为二进制数字后,再将该二进制数字转为对应的十六进制数字为FFFFFFFD,如此一来就可通过程序验证是否转换正确,代码如下:
#include <stdio.h>
int main()
{
int i = -3;
printf("%#X\n", i);
return 0;
}
练习1:求十进制数字-100对应的的二进制数字
- 为了方便运算,我们不需要直接将十进制数字100转为对应的二进制数字,可以先将十进制数字100转为对应的十六进制数字,再将十六进制数字转为对应的二进制数字。十进制数字100对应的十六进制数字为64,十六进制数字为64对应的二进制数字为0110, 0100
- 0110, 0100取反变为1001, 1011