C语言 第11节 补码
学习目标
一、在VC++6.0中,一个int类型的变量所能存储的数字的范围是多少?
- 最大int整数十六进制表示是:7FFF FFFF (首位是0,表示正,其余都是1)
- int 类型变量所能存储的绝对值最大的负整数用十六进制表示:
二进制:1000 0000 0000 0000 0000 0000 0000 0000
十六进制:8000 0000
因为一取反,0全变成1了
1字节8位的最大绝对值负数
(1)🚫,最高位没有
1000 0001
0111 1110
0111 1111
(2)可以
1000 0000
0111 1111
1000 0000
二、最小负数的二进制代码是多少?
三、最大正数的二进制代码是多少?
四、已知一个整数的二进制代码,求出原始的数字
五、数字超出最大整数会怎样?
溢出,保留后面的
六、不同类型数据之间的相互转化
概念
-
原码
也叫符号-绝对值码,最高位0表示正,1标识负。其余二进制位是该数字绝对值的二进制位
简单易懂
加减运算复杂
存在加减乘除4种运算,增加了CPU的复杂度
0的表示不唯一:10000 或 00000 -
反码
反码运算不便,也没有在计算机中使用 -
移码
表示数值平移n位,主要用于浮点数的阶码的存储 -
补码
主要用来解决整数以什么样的二进制存储
(1)十进制转二进制
1)正整数转二进制
除二取余,直至商为零,余数倒序排
2)负整数转二进制
先求该负数对应的正整数的补码,然后将所有的位取反。末尾➕1,不够位时左侧补1(int整数类型4个字节,4 x 8 = 32位,补够32位。short是2字节,long是8字节)
3)零转二进制:全是0
# include <stdio.h>
int main(void) {
int i = -3;
printf("%d\n", i); //FFFFFFFD
int j = 0xFFFFFFEF;
printf("%d\n", j); // -17
return 0;
}
(2)二进制转十进制
1)如果首位是0,代表整数,按普通方法转化
2)如果首位是1,代表负数,将所有位取反,末位➕1,所得数字就是负数的绝对值
整数高位是0,负数高位是1。不同类型的数据之间转化,如果是位数多的赋值给位数少的,会将位数多的二进制的高位截掉,只保留末位的符合位数少的位数的二进制,这时值可能就变了。
eg: int 转char
char a = 129;
129 = 128 + 1
= 64 * 2 +1
= 8 * 8 * 2 +1
= 23 * 23 * 2 + 1
= 27 +1
int : 0000 0000 0000 0000 0000 0000 1000 0001
将int 赋值给char,高位的0都被截取了,4字节只保留1字节:
char : 1000 0001
根据补码:高位是1是负数,取反加一:0111 1111 = - 127