C语言基础教程(8)进制转换及补码

进制转换及补码


位运算符

        约翰·冯·诺依曼(JohnVonNouma,1903-1957),美藉匈牙利人

        被称为计算机之父:2大贡献

               二进制

               计算机设备分类:运算器 控制器 存储器 输入设备 输出设备

 

什么是进制

数字是本质,进制只是不同表现方式

一个十六进制位,要用4个二进制数表示,(1)16 = (0001)2 前面补齐

二进制 逢 二进一

十进制    逢 十进一 dec

八进制    逢 八进一     oct 0数字   int i = 05;

十六进制 逢 十六进一 hex   0x数字  0X数字

                 int i = 0x5;int i = 0X5;

生活中:

七进制    七天进周  

十二进制 十二月进年

二十四进制 二十四小时进日

六十进制  六十分钟进小时

       六十秒钟进分钟

汇编里

1101B 二进制

1357O 八进制

2049D 十进制

3FB9H 十六进制

十进制(D) 二进制(B) 八进制(O)   十六进制(H)  

0      0      0      0  

1      1      1      1

2      10     2      2

3      11     3      3

4      100    4      4

5      101    5      5

6      110    6      6

7      111    7      7

8      1000       10     8

9      1001       11     9

10     1010       12     a (A)

11     1011       13     b (B)

12     1100       14     c (C)

13     1101       15     d (D)

14     1110       16     e (E)

15     1111       17     f (F)

16     10000      20     10

 

017 = 7 + 1*8  = 15

0x17 = 7 + 1*16 = 25

1234 =  4 + 1*10三次方 + 2*10二次方 + 3*10一次方

0x32c = c + 3*16二次方 + 2*16一次方 = 4354

最高幂数是位数-1

#include<stdio.h>

int main(void)

{

    int i = 0x32c;

    printf("i = %d\n", i);

    printf("i = %x\n", i);

    printf("i = %o\n", i);

    /*

        printf的用法

        %d 以十进制输出

        %x 或 %X  以十六进制输出

        %o 或 %O  以八进制输出

    */

    return 0;

}
#include <stdio.h>

int main(void)
{

    int i = 1000;

    print("%X\n", i)  //3E8

    printf("%#X\n",i) //OX3E8 %#X 推荐

    return 0;

}

 


补码

   原码:

       也叫符号绝对值

       最高位0表示正 1表示负,其余二进制位是该数字的绝对值的二进制位

       在计算机中,从未被使用!         

   反码

       反码运行不便,也没有在计算机中应用

       ----------------------------------------- 

   移码

       表示数值平移n位,n称为移码量

       移码主要用于浮点数的阶码的存储

       ----------------------------------------- 

   补码  

地址是内存单元编号从 0到4G-1

即 2的32次方-1   总线若是32位,则有32个0,1

    主要解决整数的存储 int 4字节 32位个0,1

 

A 已知十进制求二进制

求正整数的二进制  

    除2取余,直到商为零,余数倒序排列

            

求负整数的二进制  

   先求出与该负数相对应的正整数的二进制代码,

   然后,将所有位取反末尾加1,不够位数时,左边补一 

       4字节int -5 先求5的二进制 

0000 0000   0000 0000     0000 0000  0000 0101  所有位取反,末尾加1

1111 1111   1111 1111     1111 1111  1111 1011   16进制:FFFFFFFB                                           

       2字节  short int(-3) 先求3的二进制

0000 0000 0000 0011      所有位取反,末尾加1 

1111 1111 1111 1101     用十六进制表示:  FFFD

求零的二进制

     全是零

 

B 已知二进制求十进制   

   如果首位是0,则表明是正整数,

   按普通方法来求

         

   如果首位是1,则表明是负整数,

   将所有位取反末尾加1,所得数字就是该负数的绝对值

       习题:FFFFFFF5 已知二进制  求其代表的整数是多少?

1111 1111 1111 1111 1111 1111 1111 0101

        由于最高位是1,所以最终是负数,先对其所有取反

0000 0000 0000 0000 0000 0000 0000 1010 末尾加1后

0000 0000 0000 0000 0000 0000 0000 1011  该值为11 所以最终结果:-11

         

   如果全是零,则对应的十进制数字就是零

 

C  二进制 到 十六进制

    4位一段 从右到左 分别转化  不够左边初零

(0010 1110)2  --  (2E)16

 

D 十六进制 到 二进制 

一位转化成4位,不够左边补0 

(1)16-- (0000 0000 0000 0000 0000 0000 0000 0001)2

 

E 二进制 转到 八进制 

从右往左,三位一段 不够被0

 

F 八进制 与 十六进制 不能直接转化。通过中间进制。

 

进制总结:

进制属于什么知识点,许多人爱不懂装懂。学习好它有利于将来学习底层如汇编等知识,但要往高级语言发展则不需要掌握,另外学好它对后面位运算等有帮助。

        

学习后应掌握:

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

       32位系统,32个0,1组合表示的内存单元,8个十六进制数组合)

       int类型变量所能存储的最大正数用十六进制表示: 7FFFFFFF

       int类型变量所能存储的绝对值最大负整数用十六进制表示:

80000000           

         最小负数的二进制代码是多少   1(0-0 31个0)

         最大正数的二进制代码是多少   0(1-1 31个1)

            

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

按“已知二进制求十进制”求

       数字超过最大正数会怎样  变成负数 0111 1111=127 1000 0000 -128

 

不同数据类型转化   

丢失最高位.只截留后者类型所占的字节数。

例如: int 类型 转化 为char 则高3位字节被截取。只保留最后一位字节。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值