zoukankan      html  css  js  c++  java
  • 详解2进制,10进制,16进制,8进制,36进制

    本篇介绍C/C++语言中的进制的概念,主要介绍2进制、10进制、16进制,这三种是编程时必须掌握的也是最经常使用的。另外,介绍8进制和36进制,当中 36进制在实际project项目中会遇到。 (本文选自《C/C++学习指南》。邵发。附录“2进制,10进制,16进制”)

    讲2进制、10进制、16进制的视频教程,点击观看


     权利声明:作者拥有本书的所有权利。

    作者授权不论什么人都能够自由转载本站点公布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载。不得有不论什么改动,必须包括“权利声明”和“官网地址” ② 仅限于网络转载,即终于结果发布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。

    除非本人同意。不论什么人不得将本站点内容内容用于不论什么的其它用途。 
    官网地址: http://www.afanihao.cn/  留言请到http://www.afanihao.cn/kbase/

    1.1         引例一

    先给出一段代码,请读者如今马上编译执行一遍。观察结果。

    #include <stdio.h>
    void main()
    {
           int a = 'A';
           int b = 65;
           int c = 0x41;
           printf("%d, %d, %d 
    ", a, b, c);
    }

    假设你还没有动手编译,那么请马上终止阅读本书,由于本书不是为太懒的人准备的。全部代码和演示样例,请读者务必自己手打一遍,不要拷贝。假设你是拷贝过去的,请马上烧掉本书。谢谢。

    你会发现,输出结果为:

    是的,变量a,b,c的值全然同样。实际上,这三种初始化(赋值)方法是全然等价的,仅仅是写法不一样而已

    你用哪一种办法都能够。

    1.2         引例二

    再给出还有一段代码,请马上编译和执行一下:

    #include <stdio.h>
    void main()
    {
           char  a = 65;
           printf("%d,  %02X ,  %c 
    ",  a,  a,  a);
    }


    它的执行结果为:

    是的,对于同一个整数a。当它作为十进制显示时。显示为65;当作为十六进制显示为,显示为41,当作为字符显示时,显示A。

    1.3         引例三

    假设上面的样例给你的印象还不够深刻。再尝试一个样例:

    #include <stdio.h>
    void main()
    {
           // 下面变量a和b的值是同样的
           int a = 0x12345678;
           int b = 305419896;
           printf("%d, %d 
    ", a, b);
     
           // buf的内容为"ABC"
           char buf[4] = { 0x41, 66, 'C' , 0};
           printf("%s 
    ", buf);
    }


    结果为:

    1.4         整型变量的2进制表示

    本节内容对理解本章乃至全书都极为重要。假设你理解了,那么所谓进制问题对你就不再是个问题。

    首先,在第三章中已经明白的强调。每一个变量都是具有一个内存地址的。对于char型变量来说。在内存中占了1个字节。对于int型变量来说,在内存中占了4个字节。

    为了让你更easy的理解,我们就先从char開始吧。

    然后,我们看一下在计算机的内存里。倒底是怎么存储的。我们从最最简单的数開始。比如。定义一个变量 char  a = 13,此变量a占了一个字节的内存。

    在内存中,一个字节有8个位(bit),每个位能够是1或0。

    那么a的表示为:

    0

    0

    0

    0

    1

    1

    0

    1

    就是说,在物理内存中,它就是这么存储的。

    至于物理上怎样表示1,怎样表示0,读者是不须要关心的。

    你能够简单地觉得一个位就相应一个“开关”。1表示打开,0表示关闭。以后,我们就称它的按位表示为 0000 1101 。

    所以,char  a = 13 或者char  a = 0x0C ,这两种写法表示的意思是一样的:分配一个变量,相应一个字节。字节的按位物理表示为 0000 1101。

    明确了吗?所谓10进制还是16进制是对人类而言的。不是同的说法。

    可是对于计算机而言,要存储这个数值。就是要用8个位(相应8个物理开关)。

    这是哲学上的“形式和内容”的关系。

    反过来,已经知道一个变量a的内存表示为 0000 1101,我们想在控制台上把它的值显示出来。

    那么能够按10进制显示。也能够按16进制显示。

    对你是小学生水平,那好吧,作为程序猿我仅仅好给按10进制显示给你了。

    printf (" %d  ",  a);

    假设你有碰巧看过本书,那好吧。我给按16进制显示:

    printf(" %02X ", a);

    1.5         进制换算

    这一节介绍的是数学里的内容。

    作者的数学水平不高,在这里仅仅能让你大概地理解一下。

    实际上,正如作者一再强调的。编程不须要太高的数学水平,差点儿对数学是没有要求的。

    首先。说说从16进制到10进制的换算。我们知道,0x41(十六进制) 和65(十进制)是等价的。那么怎么手工计算呢?以下给出演示样例:(以下不是代码,是在草稿纸的手算方法

    0x41  =  4 * 16  + 1  = 65

    0x12345678 = 1 * 167 + 2 * 166  + 3*165 + 4 * 164 + 5 * 16+ 6 * 162 + 7 *161 + 8 = 305419896

    能够看出。对于16进制,每个数字上的权重就是 16n-1  (即16的n-1次方)

    然后,说说从2进制到10进制的换算。

    0000 1101 =   0 + 0 + 0 + 0 + 8 + 4 + 0 + 1 = 13

    或者严格一点:

    0000 1101 =   0 + 0 + 0 + 0 + 23 + 22+ 0 + 1 = 13

    能够看出,对于2进制,每个数字上的权重就是2n-1(即2的n-1次方)

    1.6         怎样打印2进制

    在printf參数中,使用控制符%d能够按10进制打印。使用%X能够按16进制打印。那么,有没有按2进制打印呢?

    非常遗憾,printf不能直接打印二进制。

    为了弥补这个遗憾,作者贡献一个按2进制打印的函数。

    #include <stdio.h>
     
    // 把一个整数转成二进制字符串
    // value: 输入整数
    // buf: 输出字符串
    // num_of_bits: 指定要打印的位数
    void to_binary(unsigned int value, char buf[], int num_of_bits)
    {
           for(int i=0; i<num_of_bits; i++)
           {
                  unsigned int mask = 1 << (num_of_bits -1 - i);
                  if ( value & mask)
                        buf[i] = '1';
                  else
                        buf[i] = '0';
           }
           buf[num_of_bits] = 0;
    }
     
    void main()
    {
           char buf[33];
           to_binary(135, buf, 8);
           printf("%s 
    ", buf);
    }


    1.7         8进制

    8进制在project实际中一般不会用到。这个使用方法没有价值。和前面的类似。8进制表示每一个数字的权重是8n-1(即8的n-1次方)。比如,15(八进制)等于13(十进制)。

    在C/C++语言中,八进制的字面常量以0开头。

    比如以下的代码。

    #include <stdio.h>
    void main()
    {
           int a = 015; // 以0开头表示八进制
           int b = 0x0D; // 以0x开头表示十六进制
           int c = 13;  // 十进制
     
           printf("%d, %d, %d 
    ", a, b, c);
    }


    1.8         36进制

    正如序列 0, 1, 2, ..., 9, A, ..., F来表示16进制一样,用序列0, 1, 2, ...,9, A, B, ..., Y, Z来表示36进制。其运算方法也全然是一样的,每个数字的权重是36n-1(36的n-1次方)。

    比如。(下面不是代码。是草稿纸上的手算方法)

    2Z = 36 * 2  + 35 = 107

    其实,36进制在project实践中是一个非常实用的知识。比方。相同用4个字符来表示数字。使用10进制能够表示0000~9999,使用16进制能够表示0000~FFFF,使用36进制能够表示0000~ZZZZ。

    能够,使用36进制的表示能力最强。

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5180228.html
Copyright © 2011-2022 走看看