精华内容
下载资源
问答
  • C语言二进制、八进制、十六进制详解
    2021-05-22 17:07:30

    什么是二制制?

    在数学计算中,二进制计数系统的公分母是最小的,它以2为基数。你还记得在小学或中学时所学的不同的计数系统吗?笔者在上小学时,曾在一堂数学课中学过以6为基数的计数系统;你先数1,2,3,4,5,然后是10,11,12,13,14,15,然后是20,等等,实际上,应该先数0,1,2,3,4,5,然后是10,1l,12,13,14,15,等等。从O开始数,能比较清楚地看出每6个数字组成一组——因此6就是基数。注意,你应该从O开始一起数到比基数小1的数(因为基数是6,所以你应该从O数到5)。当你数到5后,接着应该开始数两位数。如果你思考一下,你就会发现这与以10为基数(十进制)的计数系统是类似的——在你数到比基数小1的数(9)后,就转到两位数,并继续往下数。

    计算机中的计数系统以2为基数——即二进制。由于以2为基数,所以你先数O,1,然后是10,11,然后是100,101,110,111,然后是1000,1001,1010,1011,1100,1101,1110,1111,等等。与以6为基数时不同,在以2为基数时,在数到两位数之前,只需从O数到1。

    那么,为什么在计算机中要以2为基数呢?其原因在于计算机中使用了晶体管。晶体管使现代计算机的出现成为可能。晶体管就象电灯开关,电灯开关有“开”和“关”两种状态,晶体管也是如此。你可以认为“关”表示0,“开”表示1,这样,你就可以用一个晶体管(如果你愿意,也可以用一个电灯开关)来进行从。到1的计数了。仅仅使用两个数字(O到1)还不能做任何复杂的计算,但是我们还可以继续下去。假设有一个电灯开关控制面板,上面有4个大电灯开关,尽管每个开关只有两种状态,但是这些开关组合起来就会有16或2。(4个开关,每个2种状态)种不同的状态。这样,你就可以用4个开关来进行从。到15的计数了,见表20.22。

    表20.22  进制计数

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

    开关         十进制值            幂

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

    O             O

    1             1                 20

    10             2                 21

    11             3

    100             4                 22

    101             5

    110             6

    111             7

    1000             8                 23

    1001             9

    1010            10

    1011            11

    1100            12

    1101            13

    1110            14

    1111            15

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

    上表说明了很重要的三点:

    通过把开关并排放在一起,你就可以用它们来计数了——在本例中最多可以数到15(总共16次计数);

    你可以把每个开关看作是一个二进制位,就象十进制系统中的十进制位一样;

    如果每个开关都代表一个二进制位,那么它们刚好也都代表一个2的幂(20,21,22,23,等等)。

    此外,请注意,在表中出现2的幂的地方,计数结果就要增加一个二进制位。这与十进制系统是相同的,每增加一个十进制位时,这个新的十进制位也正是一个10的幂(1=100,10=101,100=102,等等)。明白了这一点后,你就可以很容易地把二进制数转换为十进制数了,例如,二进制数10111就是(1×24)+(O×23)+(1×22)+(1×21)+(1×20),它等于十进制的(16+0+4+2+1)或23。10 1110 1011,一个大得多的二进制数,就是(1×29)+(O×28)+(1×27)+(1×26)+(1×25)+(0×24)+(1×23)+(O×22)+(1×21)+(1×20),它等于十进制的(512+0+128+64+32+0+8+0+2+1)或747。

    那么所有这些和我们有什么关系呢?在计算机领域中,存在着位(bit),半字节(nibble)和字节(byte)。一个半字节是4位,一个字节是8位。什么是一个位呢?它就是一个晶体管。因此,一个字节就是8个相邻的晶体管,就象表20.1中的4个开关一样。记住,如果你有4个组合在一起的开关(或晶体管),你就可以数24或16,你可以把这看作是由开关组成的一个半字节。如果一个半字节是4个晶体管组合在一起,那么一个字节就是8个晶体管组合在一起。你可以用8个晶体管数到2。或256,从另一个角度看,这意味着一个字节(含8个晶体管)可以表示256个不同的数字(从0到 255)。再深入一点,Intel 386,486和Pentium处理器被叫做32位处理器,这意味着这些Intel芯片所进行的每一次运算都是32位宽或32个晶体管宽的。32个晶体管,或32位,等价于232或4,294,967,296,即它们能表示超过40亿个不同的数字。

    当然,上述介绍还不能解释计算机是如何利用这些数字产生那种神奇的计算能力的,但它至少解释了计算机为什么要使用以及是如何使用二进制计数系统的。

    什么是八进制?

    八进制是以8为基数的一种计数系统。在八进制系统中,你是这样计数的:O,1,2,3,4,5,6,7,10,ll,12,13,等等。下面比较了八进制(第二行)和十进制(第一行)中的计数过程:

    O,l,2,3,4,5,6,7,8,9,10.11,12,13,14,15,16

    0,1,2.3,4,5,6,7,10,11,12,13,14,15,16,17,20

    注意,在八进制中,在数到7后,就要增加一个八进制位,第二个八进制位显然就是8?(等于十进制的8)。如果你数到第三个八进制位(八进制的100),那将是8?或十进制的64,因此,八进制的100等于十进制的64。

    现在,八进制已经不象以前那样常用了,这主要是因为现在的计算机使用的是8,16,32或64位处理器,最适合它们的计数系统是二进制或十六进制(见20.24中有关十六进制计数系统的介绍)

    C语言支持八进制字符集,这种字符要用反斜杠字符来标识。例如,在C程序中,下面的语句并不少见:

    if(x=='\007')break;

    这里的"\007"恰好就是ASCII值为7的字符;该语句用来检查终端鸣笛字符。另一个常见的八进制数是"\033",即Escape字符(在程序中它通常表示为"\033")。然而,八进制数现在已经很少见了——它们被十六进制数代替了。

    什么是十六进制?

    十六进制(hexadecimal,缩写为hex)是以16为基数的计数系统,它是计算机中最常用的计数系统。十六进制中的计数过程为:O,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,等等。十六进制中的字母是几个单位数标识符,表示十进制的10到15。要记住在不同基数下的计数规则,即从O数到比基数小1的数字,在十六进制中这个数就是十进制的15。因为西式数字中没有表示大于9的单位数,所以就用A,B,c,D,E和F来表示十进制的10到15。在十六进制中,数到F之后,就要转到两位数上,也就是1OH或Ox1O。下面对十六进制(第二行)和十进制(第一行)的计数过程作一下比较:

    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,……

    1,2,3,4,5,6,7,8,9,A, B, C, D, E, F, 10,……

    注意,十进制的10等于十六进制的A。与前面讨论过的计数系统一样,每增加一个十六进制位,实际上就增加了一个16的幂,即160(1),161(16),162(256),163(4096),等等。因此,十六进制数3F可以展开为(3×161)+(F×160),等于十进制的(48+15)或63;十六进制数13F可以展开为(1×162)+(3×161)+(F×160),等于十进制的(256+48+15)或319。在c程序中,这两个数用0x3F或Oxl3F这样的形式来表示,其中的“0x”前缀用来告诉编译程序(和程序员)该数字应被当作十六进制数来处理。如果不加“0x”前缀,你就无法判断一个数究竟是十六进制数还是十进制数(或者是八进制数)。

    对表20.22稍作改进,加入十六进制的计数过程,就得到了表20.24:

    —————————————————————————————————

    二进制    十进制值    二进制幂    十六进制    十六进制幂

    —————————————————————————————————

    0000        O                       O

    0001        1    20                 1            160

    0010        2    21                 2

    0011        3                       3

    0100        4    22                 4

    0101        5                       5

    0110        6                       6

    0111        7                       7

    1000        8    23                 8

    1001        9                       9

    1010        10                      A

    1011        11                      B

    1100        12                      C

    1101        13                      D

    1110        14                      E

    1111        15                      F

    10000       16   24                10             161

    —————————————————————————————————

    笔者在上表的最后又加了一行,使计数达到十进制的16。通过比较二进制、十进制和十六进制·你就会发现:“十”在二进制中是“1010”,在十进制中是“10”,在十六进制中是“A”;。。十六”在二进制中是“1 0000"或“10000”,在十进制中是“16”,在十六进制中是“1O”,,(见上表的最后一行)。这意味着什么呢?因为今天的16,32和64位处理器的位宽恰好都是16的倍数,所以在这些类型的计算机中用十六进制作为计数系统是非常合适的。

    十六进制位和二进位之间有一种“倍数”关系。在上表的最后一行中,二进制值被分为两部分(1 0000)。4个二进制位(或者4位)可以计数到15(包括O在内共16个不同的数字),而4位(bit)正好等于一个半字节(nibble)。在上表中你还可以发现,一个十六进制位同样可以计数到15(包括。在内共l 6个不同的数字),因此,一个十六进制位可以代表4个二进制位。一个很好的例子就是用二进制表示十进制的15和16,在二进制中,十进制的15就是1111,正好是4个二进制位能表示的最大数字;在十六进制中,十进制的15就是F,也正好是一个十六进制位能表示的最大数字。十进制的16要用5个二进制位(1 0000)或两个十六进制位(10)来表示。下面把前文提到过的两个数字(0x3F和0x13F)转换为二进制:

    3F              111111

    l3F          100111111

    如果把前面的空格换为O,并且把二进制位分成4位一组,那么看起来就会清楚一些:

    3F     0 0011 1111

    l3F    1 0011 1111

    你并不一定要把二进制位分成4位一组,只不过当你明白了4个二进制位等价于一个十六进制位后,计数就更容易了。为了证明上述两组数字是相等的,可以把二进制值转换为十进制值(十六进制值到十进制值的转换已经在前文中介绍过了);二进制的111111就是(1×25)+(1×24)+(1×23)+(1×22)+(1×21)+(1×20),等于十进制的(32+16+8+4+2+1)或63,与0x3F的转换结果相同。二进制的1 0011 1111就是(1×28)+(O×27)+(0×26)+(1×25)+(1×24)+(1×23)+(1×22)++(1×21)+(1×20),等于十进制的(256+32+1 6+8+4+2+1)或319。因此,十六进制和二进制能象手掌和手套那样相互匹配。

    更多相关内容
  • 一、二进制数、位和字节 1、二进制数 以为基地表示的数字称为二进制数。二进制中的2和十进制中的10作用相同。二进制数1101可表示为: 1*23+1*22+0*21+1*20 以十进制数表示 1*8+1*4+0*2+1*1 = 13 二进制系统可以把...

    一、二进制数、位和字节

    1、二进制数

    以为基地表示的数字称为二进制数。二进制中的2和十进制中的10作用相同。二进制数1101可表示为:

    1*23+1*22+0*21+1*20
    以十进制数表示
    1*8+1*4+0*2+1*1 = 13
    二进制系统可以把任意整数(如果有足够的位)表示为 0和1的组合。数字计算机通过关闭和打开状态的组合来表示信息,分别是0和1。

    2、二进制整数

    通常1字节包含8位。C语言用字节(byte)表示储存系统字符集所需的大小。所以C字节可能是8位、9位、16位或其他值。描述存储芯片和数据传输率中所用的字节指的是8位字节,计算机界通常用8位组这个术语特制8位字节。可以从左往右给这8位分别编号7-0。在1字节中,编号是7的位称为高阶位,编号是0的位被称为低阶位。
    在这里插入图片描述
    这里128是2的7次幂,依次类推,该字节能表示的最大数字是把所有位都设置1:11111111.这个二进制的值是
    128+64+32+16+8+4+2+1=255
    最小值是00000000,其值为0。
    一字节可储存0-255范围内的数字,总共256个值。或者通过不同的方式解释位组合,程序可以用1字节存储-128-127范围内的整数,总共还是256个值。
    通常unsigned char用一字节可表示的范围是0-255,而signed char用一个字节表示的范围是-128-127.

    3、有符号整数

    如何表示有符号整数取决于硬件,而不是语言。
    第一种:种符号量表示法
    用1位(如,高阶位)储存符号,只剩下7位表示数字本身(假设储存在一个字节里面)。10000001表示-1,00000001表示1,因此,其表示范围是-127-+127。此方法的缺点是有俩个0:+0和-0。这容易混淆,而且用俩个位组合来表示一个值有些浪费。
    第二种:二进制补码
    二进制补码用1字节的后7位表示0-127,高阶位设置为0。如果高阶位是1,表示的值为负。
    这俩种方法的区别在于如何区别负值。
    二进制反码方法通过反转位组合中的每一位成一个负数。例如00000001是1,那么11111110是-1.这种方法也有一个-0:11111111.该方法能表示-127到127的数。

    4、二进制浮点数

    浮点数分俩部分储存:二进制小数和二进制指数。

    二、其他进制数

    1、八进制

    八进制指八进制计数系统,该系统基于8的幂,用0-7表示数字。例如,八进制数451(在C中写作0451)表示为:4*82+5*81+1*80=297(十进制数)。
    每个八进制位对应三个二进制位。下表列出了对应关系。注意:将八进制数转换成二进制形式时,不能去掉中间的0。例如八进制数0173的二进制形式是011111011,不是0111111。

    八进制位等价的二进制位
    0000
    1001
    2010
    3011
    4100
    5101
    6110
    7111
    2、十六进制

    十六进制指十六进制计数系统,该系统基于18的幂,用0-15表示数字。由于没有单独的数(即0-9这样单独一位的数)表示10-15,所以用字母A-F来表示,C语言中,可以用大写或者小写。例如,十六机制数A3F(在C中写作0xA3F)表示为
    10*162+3*161+15*160=2623(十进制)
    每一个十六进制位都对应一个4位的二进制数(即4个二进制位),那么俩个十六进制恰好对应一个8位字节。第一个十六进制表示前4位,第二个十六进制位表示后4位。因此,十六进制很适合表示字节值。

    十进制十六进制等价二进制
    000000
    110001
    220010
    330011
    440100
    550101
    660110
    770111
    881000
    991001
    A101010
    B111011
    C121100
    D131101
    E141110
    F151111
    展开全文
  • 数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写)。 加法 二进制加法有四种情况: 0+0=0,0+1=1,1+0=1,1...

    一,概念

    加法

    乘法

    减法

    除法

    二,二进制,十进制,十六进制转化

    二进制转十进制

    十进制转二进制

    二进制转十六进制

    十六进制转二进制

    三,原码,反码,补码

    正数

    负数

    四,操作符中的运用

    << 左移操作符

    >> 右移操作符 

    五,位操作符

              &按位与

     |按位或

     ^按位异或

     六,笔试题

    1,求两个数二进制中不同位的个数

    2,打印整数二进制的奇数位和偶数位

    3,统计二进制中1的个数


    一,概念

    二进制(binary)是在数学数字电路中指以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 。

    数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写)。

    加法

    二进制加法有四种情况: 0+0=0,0+1=1,1+0=1,1+1=10(0 进位为1) 
     

    乘法

    二进制乘法有四种情况: 0×0=0,1×0=0,0×1=0,1×1=1 
     

    减法

    二进制减法有四种情况:0-0=0,1-0=1,1-1=0,0-1=1  
     

    除法

    二进制除法有两种情况(除数只能为1):0÷1=0,1÷1=1

    二,二进制,十进制,十六进制转化

    二进制转十进制

    方法:“按权展开求和”,该方法的具体步骤是先将二进制的数写成加权系数展开式,而后根据十进制的加法规则进行求和

     规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增,而十分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。

    十进制转二进制

    一个十进制数转换为二进制数要分整数部分和小数部分分别转换,最后再组合到一起。

    整数部分采用 "除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

    例:125

     小数部分要使用“乘 2 取整法”。即用十进制的小数乘以 2 并取走结果的整数(必是 0 或 1),然后再用剩下的小数重复刚才的步骤,直到剩余的小数为 0 时停止,最后将每次得到的整数部分按先后顺序从左到右排列即得到所对应二进制小数。例如,将十进制小数 0.8125 转换成二进制小数过程如下。

    当然最快速的方法是记得2所有次方对应的值

    0 1 2 4 8 16 32 64 128

    0.5 0.25 0.125 0.625 

    通过比较相应位次的大小累加得到目标值,学过网络技术的理解最深刻。

    二进制转十六进制

                    二进制                   十六进制
    00000
    00011
    00102
    00113
    01004
    01015
    01106
    01117
    10008
    10019
    1010A
    1011B
    1100C
    1101D
    1110E
    1111F

    二进制转16进制,取四位 合一位,从小数点开始,向左向右取,到高位,不够位数 补0,16进制的表示法,用字母H后缀表示,比如BH就表示16进制数11;也可以用0X前缀表示,比如0X23就是16进制的23.

    十六进制转二进制

    例:CF6.53  

    C:1100   F: 1111  6:0110  5:0101  3:0011

    所以对应二进制:1100 1111 0110.0101 0011

    三,原码,反码,补码

    正数:

    原码、反码、补码相同;

    以123为例:

    原码:01111011

    反码:01111011

    补码:01111011

    负数

    负数的原码:为取绝对值的数转二进制,然后符号位加一;

    负数的反码:对该数的原码除符号位外,各位取反;

    负数的补码:对该数的反码加1。负数的补码即为负数的二进制数。

    以-123为例:

    原码:11111011,其中最高位1为符号位。

    反码:10000100

    补码:10000101

    四,操作符中的运用

    位移操作符

    << 左移操作符

    #include<stdio.h>
    int main()
    {
    	int num = 10;
    	int b = 10 << 1;
    	printf("%d", b);
    	return 0;
    }

    左移操作符 移位规则

    左边抛弃、右边补0


    int main()
    {
    
        int a = 5;//4byte = 32bit
    	int b = a << 1;
    	//int b = a + 1;
    	printf("%d\n", b);
    	printf("%d\n", a);
    
    	//00000000000000000000000000000101
    	//00000000000000000000000000000101
    	//00000000000000000000000000000101
    }

    >> 右移操作符 

    #include<stdio.h>
    int main()
    {
    	int a = -1;
    	int b = -1 >> 1;
    	printf("%d", b);
    	return 0;
    }

    右移操作符 移位规则:

    1. 逻辑移位 左边用0填充,右边丢弃
    2. 算术移位 左边用原该值的符号位填充,右边丢弃

     

    int main()
    {
    	int a = -1;
    	int b = -1 >> 1;
    	printf("%d", b);
    	return 0;
    	// 11111111111111111111
    	// 算数右移 11111111111111111111
    	// 逻辑右移 01111111111111111111
    }
    int main()
    {
    	int c = -1;
    	int d = c << 1;
    	printf("%d\n", d);//打印的是原码的值
    
    	//10000000000000000000000000000001 - 原码
        //11111111111111111111111111111110 - 反码
    	//11111111111111111111111111111111 - 补码
    	return 0;
    }
    	

     对于移位运算符,不要移动负数位,这个是标准未定义的。 例如:

     int num = 10;
     num>>-1;//error

    五,位操作符

    &
    |
    ^
    //按位与
    //按位或
    //按位异或

    &按位与

    int main()
    {
    	int a = 3;
    	int b = -2;
    	int c = a & b;
    	printf("%d\n", c);
    	//%d -  说明我们要打印c的值,以有符号的形式
    	return 0;
    
    }
    //10000000000000000000000000000010 -2的原码
    //11111111111111111111111111111101 -2的反码
    //11111111111111111111111111111110 -2的补码
    
    //00000000000000000000000000000011  3的补码
    
    //00000000000000000000000000000011
    //11111111111111111111111111111110
    //00000000000000000000000000000010
    
    结果为2


     

     |按位或

    int main()
    {
    	int a = 3;
    	int b = -2;
    	int c = a | b;
    	printf("%d\n", c);
    	return 0;
    }
    
    //10000000000000000000000000000010 -2的原码
    //11111111111111111111111111111101 -2的反码
    //11111111111111111111111111111110 -2的补码
    
    //00000000000000000000000000000011  3的补码
    
    
    //11111111111111111111111111111110
    //00000000000000000000000000000011 
    //11111111111111111111111111111111
    
    结果为-1

     ^按位异或

    int main()
    {
    	int a = 3;
    	int b = -2;
    	int c = a ^ b;
    	printf("%d\n", c);
    	//%d -  说明我们要打印c的值,以有符号的形式
    	return 0;
    
    }
    //10000000000000000000000000000010 -2的原码
    //11111111111111111111111111111101 -2的反码
    //11111111111111111111111111111110 -2的补码
    
    //00000000000000000000000000000011  3的补码
    
    //异或 - 相同为0,相异为1
    //11111111111111111111111111111110
    //00000000000000000000000000000011 
    //11111111111111111111111111111101
    
    结果为-3

     六,笔试题

    1,求两个数二进制中不同位的个数

    1. 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
    2. 统计异或完成后结果的二进制比特位中有多少个1即可
    #include <stdio.h>
    int calc_diff_bit(int m, int n)
    {
    	int tmp = m^n;
    	int count = 0;
    	while(tmp)
    	{
    		tmp = tmp&(tmp-1);
    		count++;
    	}
    	return count;
    }
     
     
    int main()
    {
     int m,n;
     while(scanf("%d %d", &m, &n) == 2)
     {
         printf("%d\n", calc_diff_bit(m, n));
     }
     return 0;
    }

    2,打印整数二进制的奇数位和偶数位

    1. 提取所有的奇数位,如果该位是1,输出1,是0则输出0
    2. 以同样的方式提取偶数位置
     
     
    检测num中某一位是0还是1的方式:
       1. 将num向右移动i位
       2. 将移完位之后的结果与1按位与,如果:
          结果是0,则第i个比特位是0
          结果是非0,则第i个比特位是1
    void Printbit(int num)
    {
    	for(int i=31; i>=1; i-=2)
    	{
    		printf("%d ", (num>>i)&1);
    	}
    	printf("\n");
        
    	for(int i=30; i>=0; i-=2)
    	{
    		printf("%d ", (num>>i)&1);
    	}
    	printf("\n");
    }

    3,统计二进制中1的个数

    
    方法一:
    
    int count_one_bit(int n)
    {
    	int count = 0;
    	while(n)
    	{
    		if(n%2==1)
    			count++;
    		n = n/2;
    	}
    	return count;
    }
    方法二:
    
    int count_one_bit(unsigned int n)
    {
    	int count = 0;
    	int i = 0;
    	for(i=0; i<32; i++)
    	{
    		if(((n>>i)&1) == 1)
    			count++;
    	}
    	return count;
    }
     
    
    
    方法三:
    int count_one_bit(int n)
    {
    	int count = 0;
    	while(n)
    	{
    		n = n&(n-1);
    		count++;
    	}
    	return count;
    }

    
                                            
    展开全文
  • 文章目录一、二进制、八进制、十六进制整数的书写1、二进制2、八进制3、十六进制4、需要注意的坑二、二进制、八进制、十六进制整数的输出三、获取视频教程四、版权声明整数是我们生活中常用的数据类型,也是编程中...

    文章目录

    一、二进制、八进制、十六进制整数的书写

    1、二进制

    2、八进制

    3、十六进制

    4、需要注意的坑

    二、二进制、八进制、十六进制整数的输出

    三、获取视频教程

    四、版权声明

    整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言用int关键字来定义整数变量(int 是 integer 的简写)。

    在定义变量的时候,可以加signed、unsigned、short和long四种修饰符。

    signed:有符号的,可以表示正数和负数。

    unsigned:无符号的,只能表示正数,例如数组的下标、人的身高等。

    short:短的,现在主流的64位操作系统下,整数占用内存4个字节,使用 4

    个字节保存较小的整数绰绰有余,会空闲出两个字节来,这些字节就白白浪费掉了。在C语言被发明的早期,或者在单片机和嵌入式系统中,内存都是非常稀缺的资源,所有的程序都在尽可能节省内存。

    long:长的,更长的整数。

    一、二进制、八进制、十六进制整数的书写

    一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。

    1、二进制

    二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头。

    以下是合法的二进制:

    int a = 0b101; // 换算成十进制为 5

    int b = -0b110010; // 换算成十进制为 -50

    int c = 0B100001; // 换算成十进制为 33

    以下是非法的二进制:

    int m = 101010; // 无前缀 0B,相当于十进制

    int n = 0B410; // 4不是有效的二进制数字

    请注意,标准的C语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

    2、八进制

    八进制由 0~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母 o)。

    以下是合法的八进制数:

    int a = 015; // 换算成十进制为 13

    int b = -0101; // 换算成十进制为 -65

    int c = 0177777; // 换算成十进制为 65535

    以下是非法的八进制:

    int m = 256; // 无前缀 0,相当于十进制

    int n = 03A2; // A不是有效的八进制数字

    3、十六进制

    十六进制由数字 0~9、字母 A~F 或a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头。

    以下是合法的十六进制:

    int a = 0X2A; // 换算成十进制为 42

    int b = -0XA0; // 换算成十进制为 -160

    int c = 0xffff; // 换算成十进制为 65535

    以下是非法的十六进制:

    int m = 5A; // 没有前缀 0X,是一个无效数字

    int n = 0X3H; // H不是有效的十六进制数字

    4、需要注意的坑

    在现实生活和工作中,我们在写十进制数的时候,为了对齐或其它原因,在数值前面加0是无关紧要的,但是,在C语言中,不要在十进制数前加0,会被计算机误认为是八进制数。

    二、二进制、八进制、十六进制整数的输出

    下表是各种进制整数的输出格式。

    86f56ab2bf290c609a75926cd0a4e001.png

    细心的读者可能会发现,上表中没有二进制的输出格式,虽然部分编译器支持二进制数字的书写,但是却不能使用printf函数输出二进制数。您可以编写函数把其它进制数字转换成二进制数字,并保存在字符串中,然后在printf 函数中使用%s输出。

    示例:

    /*

    * 程序名:book.c,此程序用于演示二进制、八进制、十六进制整数的输出。

    * 作者:C语言技术网(www.freecplus.net) 日期:20190525。

    */

    #include

    int main()

    {

    int ii=100; // 定义变量ii,赋值十进制的100。

    printf("十进制输出结果:%d\n",ii); // 十进制输出结果:100

    printf("八进制、无前缀输出结果:%o\n",ii); // 八进制、无前缀输出结果:144

    printf("八进制、有前缀输出结果:%#o\n",ii); // 八进制、有前缀输出结果:0144

    printf("十六进制、无前缀输出结果:%x\n",ii); // 十六进制、无前缀输出结果:64

    printf("十六进制、有前缀(小写)输出结果:%#x\n",ii); // 十六进制、有前缀(小写)输出结果:0x64

    printf("十六进制、无前缀输出结果:%X\n",ii); // 十六进制、无前缀输出结果:64

    printf("十六进制、有前缀(大写)输出结果:%#X\n",ii); // 十六进制、有前缀(大写)输出结果:0X64

    }

    三、获取视频教程

    百万年薪程序员录制,《C/C++高性能服务开发基础》视频教程已在CSDN学院发布,优惠价12元,地址如下:

    https://edu.csdn.net/course/play/29402

    四、版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

    来源:C语言技术网(www.freecplus.net)

    作者:码农有道

    如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发此文,让更多的人可以看到它,谢谢!!!

    展开全文
  • C语言进制间的互相转换

    千次阅读 2021-05-21 06:08:16
    进制转换通过上期所了解的进制,大家应该知道,在计算机中一个数值...十进制与二进制之间的转换十进制与二进制之间的转换是最常见也是必须掌握的一种进制转换方式,下列针对十进制转二进制二进制转十进制的方式...
  • C标准没有输出二进制的,不过用itoa()可以实现到二进的转换2. 可以使用itoa函数把变量的数值转换成2进制字符串,再用输出函数输出。3. 用 法:char *itoa(int value, char *string, int radix);4. 详细解释:itoa是...
  • C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。二进制数、八进制数和十六进制数的表示一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制...
  • 在学习C语言之前,我们首先必须要掌握二进制的思想以及数据的储存知识,这对于我们的编程来说十分的重要!一般来说,大家平时使用的数字都是由0~9共十个数字组成的,例如1、9、10、297、952等,一个数字最多能表示九...
  • C语言学习—进制之间相互转换

    千次阅读 2021-12-12 15:31:05
    进制之间的相互转换
  • 二进制的英文是Binary,简写为B或BIN,所以163 = 0b10100011(前面加上“0b”或“0B”) 八进制的英文是Octal,简写为O或OCT,所以163 = 0243(前面加上数字0,以示与十进制的区别) 十进制的英文为Decimal,简写为D...
  • c语言中且用什么符号表示

    千次阅读 2021-05-18 09:08:05
    1、变量a值是256,按十六进制输出结果是:1002、结果是:46 ,由于输入的两个变量x,y,因为输入格式的限制“%2d%2ld”,前一个格式%2d,限制只能输入2位整型数据,后一个格式%2ld,限制只能输入2位长整型数据。...
  • C语言2--进制和运算符

    2021-01-18 17:11:38
    计算机使用二进制来存储和运算数据 二进制数位上的数字只能是0和1 一个字节对应8位二进制位 进制只是数字的一种表示形式,使用二进制/十进制不影响数字的值 1.二进制和十进制的转换 整数: (1)二进制转十进制 ...
  • 16进制 10进制00 001 102 2.. .09 90A 100B 110C 120D 130E 140F 1510 161F 3120 32将数字符号按序排列成数位,并遵照某种由低位到高位的进位 方式计数表示数值的方法,...
  • 密密麻麻的二进制 正因为用电压的高低可以稳定的表示开和关,所以计算机在计算机中只有两个状态来传递信息,一个高电平,一个低电平,在计算机中,用1表示高电平,用0表示低电平。 所以,计算机世界中,只有0和1,...
  • 计算机中易混淆的进制缩写

    千次阅读 2018-08-18 23:41:00
    二进制简写是B,十六进制的简写是H,那八进制和十进制的简写分别是O和D。 B,Binary(二进制); H,Hex(十六进制); O,Octal(八进制); D,Decimal(十进制)。 但其英文缩写不一定代表在C语言输出格式的...
  • C语言二进制习题四

    2019-01-24 20:10:24
    这个函数的返回值value的二进制位模式从左到右翻转后的值。 如: 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 100110000000000000000000000...
  • 满意答案 ttegus13 2014.06.12 采纳率:58% 等级:8 已帮助:311人 代码如下: #... 请注意,ASCII是American Standard Code for Information Interchange缩写,而不是ASC2,有很多人在这个地方产生误解 00分享举报
  • B 二进制 Binary 的缩写 O 八进制 Octal 的缩写 Q 八进制 Octal 的缩写 避免字母O误认作数字0,标识改为Q D 十进制 Decimal的.八进制用什么字母表示? “H”表示“十六进制”; “K”表示“十进制”; “.八进制用...
  • C语言— —进制

    2021-10-05 13:21:30
    进制转换2.1 十进制转换为其它进制2.2 其它进制转换为十进制2.3 二进制、八进制、十六进制之间的转换3. 二进制中的存储单位4. 原码、反码、补码4.1 原码、反码和补码4.2 为什么用补码存储整数?参考资料 1. 进制 本...
  • C语言中最直观的数字表示方式自然是二进制.不过这样常常会让数字看起来“过长”,在C语言程序开发中,为了程序员阅读代码的方便,需要逐位操作变量时,常常使用十六进制,相对而言更加直观.在C语言中,为什么十六进制的...
  • 二进制型(binary)是一种数据结构,当二进制型里的位数都会是8的整数倍时,对应一个字节串。当位数不是8的整数倍,则称这段数据为位串(bitstring)。 二进制型的编写和打印形式是双小于号与双大于号之间的一列整数...
  • 进制123在c语言中用八进制和十六进制怎么表示关注:215答案:5mip版解决时间 2021-02-03 01:52提问者煭揂軟吣2021-02-02 18:00十进制123在c语言中用八进制和十六进制怎么表示最佳答案级知识专家烈酒℃灼言EL2021-...
  • 举个例子,这是一串二进制 100101 人们规定了它转换成十进制的方法:从右到左,依次从第0位开始,注意不是第1位,第0位是1,第1位是0,第二位是1,第三位是0,第四位是0,第五位是1,这样数,然后怎么算十进制呢,...
  • C语言中的进制关系

    2021-05-18 17:19:17
    引言在做数据读写传输时最常用也最直观的莫过于十进制数,但是在不同应用场合、存储的方便在C语言开发时候也常采用二进制、八进制和十六进制存储数据。这边博文将对这3种进制转十进制及十进制转这3种进制做一解释并...
  • 进制小数转十六进制(浮点型转16进制C语言代码+2种方法!
  • n位二进制的取值范围-2的n-1次方 ~ 2的n-1次方-1 输出一个整数的二进制的存储形式#include // 输出一个整数的二进制的存储形式void putBinary(int n){int bits = sizeof(n) * 8;while (bits-->0) {printf("%d", n...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,595
精华内容 9,438
关键字:

c语言二进制缩写