C语言

C语言 第11节 补码

2019-07-10  本文已影响0人  小超_8b2f

学习目标

一、在VC++6.0中,一个int类型的变量所能存储的数字的范围是多少?

  1. 最大int整数十六进制表示是:7FFF FFFF (首位是0,表示正,其余都是1)
  2. 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

二、最小负数的二进制代码是多少?

三、最大正数的二进制代码是多少?

四、已知一个整数的二进制代码,求出原始的数字

五、数字超出最大整数会怎样?
溢出,保留后面的
六、不同类型数据之间的相互转化

概念

  1. 原码
    也叫符号-绝对值码,最高位0表示正,1标识负。其余二进制位是该数字绝对值的二进制位
    简单易懂
    加减运算复杂
    存在加减乘除4种运算,增加了CPU的复杂度
    0的表示不唯一:10000 或 00000

  2. 反码
    反码运算不便,也没有在计算机中使用

  3. 移码
    表示数值平移n位,主要用于浮点数的阶码的存储

  4. 补码
    主要用来解决整数以什么样的二进制存储
    (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

上一篇 下一篇

猜你喜欢

热点阅读