从零开始学嵌入式技术之C语言04:进制与转换

一:进制

        计算机世界中只有二进制,所以计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。

(1)二进制:0、1,满2进1。

(2)十进制:0 - 9,满10进1。

(3)十六进制:0 - 9及A-F,满16进1。十六进制中,除了 0 到 9 十个数字外,还引入了字母,以便表示超过9的值。字母A对应十进制的10,字母B对应十进制的11,字母 C、D、E、F 分别对应十进制的 12、13、14、15。

二:C语言中使用不同进制表示整数

(1)二进制:以0b或0B开头表示。

(2)十进制:正常数字表示。

(3)十六进制:以0x或0X开头表示,此处的A-F不区分大小写。

#include <stdio.h>

int main()
{
    int num1 = 0b10; // 二进制
    int num2 = 210;  // 十进制
    int num3 = 0x1f; // 十六进制

    printf("num1=%d \n", num1);
    printf("num1=%d \n", num2);
    printf("num1=%d \n", num3);

    return 0;
}

三:输出格式

        不同的进制只是整数的书写方法不同,不会对整数的实际存储方式产生影响。不同进制可以混合使用,比如 10 + 015 + 0x20 是一个合法的表达式。

        使用格式占位符可以将整数以不同进制形式输出,相关的格式占位符如下:

        %d :十进制整数。

        %x :十六进制整数。

        %#x :显示前缀 0x 的十六进制整数。

        %#X :显示前缀 0X 的十六进制整数。

        代码示例:

#include <stdio.h>

int main()
{
    int x = 100;

    printf("十进制:%d \n", x);
    printf("十六进制:%x \n", x);
    printf("十六进制(0x开头):%#x \n", x);
    printf("十六进制(0X开头):%#X \n", x);
    return 0;
}

四:进制的转换

(1)二进制转换成十进制

        规则:从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。

(2) 十进制转换成二进制

   规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。

        例:将 56 转成二进制。

(3)十六进制转换成十进制

        规则:从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。

        例:请将0x34A转成十进制的数。

(4)十进制转换成十六进制

        规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。

        例:请将356转成十六进制。

(5) 二进制转换成十六进制

        规则:低位开始,将二进制数每四位一组,转成对应的十六进制数即可。

         例:请将1011011转成十六进制。

(6) 十六进制转换成二进制

        规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。

        例:请将0x23B转成二进制

五:原码、反码、补码 

        计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。

        一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数。机器数可以是有符号的,用机器数的最高位存放符号位,0表示正数,1表示负数。

        因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值),以机器数10000001为例,其真正表示的值(首位为符号位)为-1,而形式值(首位就是代表1)为129;因此将带符号的机器数的真正表示的值称为机器数的真值。

(1)原码、反码、补码的概念

1.原码

        原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值。

        正数的原码:就是它对应的二进制数。

        负数的原码:它的绝对值对应的二进制数,且最左边位变为1。

        0的原码:仍然是0。

        十进制的正负1,用8位二进制的原码表示如下:

+1 原码:[ 0000 0001 ]
-1 原码:[ 1000 0001 ]

 2.反码

        正数的反码:和原码相同。

        负数的反码:在其原码的基础上,符号位不变,其余各位取反。

        0的反码:仍然是0。

        十进制的正负1,用8位二进制的反码表示如下:

+1 原码:[ 0000 0001 ]  反码:[ 0000 0001 ]
-1 原码:[ 1000 0001 ]  反码:[ 1111 1110 ]

3.补码 

        正数的补码:和原码、反码相同。

        负数的补码:反码的基础上加1。

        0的补码:仍然是0。

        十进制的正负1,用8位二进制的补码表示如下:

+1 原码:[ 0000 0001 ]  反码:[ 0000 0001 ]  补码:[ 0000 0001 ]
-1 原码:[ 1000 0001 ]  反码:[ 1111 1110 ]  补码:[ 1111 1111 ]

         正数的原码、反码、补码都一样,三码合一

        负数的反码:它的原码符号位不变,其它位取反(0 -> 1,1 -> 0);负数的补码:它的反码+1。

        0的反码,补码都是0。

        本章的内容就到这里。

        关注我一起成为嵌入式大佬。

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值