C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。

二进制数、八进制数和十六进制数的表示

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

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语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

下面是实际测试的结果:

Visual C++ 6.0 不支持。

Visual Studio 2015 支持,但是 Visual Studio 2010 不支持;可以认为,高版本的 Visual Studio 支持二进制数字,低版本的 Visual Studio 不支持。

GCC 4.8.2 支持,但是 GCC 3.4.5 不支持;可以认为,高版本的 GCC 支持二进制数字,低版本的 GCC 不支持。

LLVM/Clang 支持(内嵌于 Mac OS 下的 Xcode 中)。

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~9 十个数字组成,没有任何前缀,和我们平时的书写格式一样,不再赘述。

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

C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

short

int

long

八进制

%ho

%o

%lo

十进制

%hd

%d

%ld

十六进制

%hx 或者 %hX

%x 或者 %X

%lx 或者 %lX

十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

%hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;

%hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。

八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。如果你比较叛逆,想使用大写形式,那么行为是未定义的,请你慎重:

有些编译器支持大写形式,只不过行为和小写形式一样;

有些编译器不支持大写形式,可能会报错,也可能会导致奇怪的输出。

注意,虽然部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制,这一点比较遗憾。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。考虑到读者的基础还不够,这里就先不讲这种方法了。

【实例】以不同进制的形式输出整数:

#include

int main()

{

short a = 0b1010110; //二进制数字

int b = 02713; //八进制数字

long c = 0X1DAB83; //十六进制数字

printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形似输出

printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

printf("a=%hx, b=%x, c=%lx\n", a, b, c); //以十六进制形式输出(字母小写)

printf("a=%hX, b=%X, c=%lX\n", a, b, c); //以十六进制形式输出(字母大写)

return 0;

}

运行结果:

a=126, b=2713, c=7325603

a=86, b=1483, c=1944451

a=56, b=5cb, c=1dab83

a=56, b=5CB, c=1DAB83

从这个例子可以发现,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。

输出时加上前缀

请读者注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。

对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。

对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。

区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

#include

int main()

{

short a = 0b1010110; //二进制数字

int b = 02713; //八进制数字

long c = 0X1DAB83; //十六进制数字

printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c); //以八进制形似输出

printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c); //以十六进制形式输出(字母小写)

printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c); //以十六进制形式输出(字母大写)

return 0;

}

运行结果:

a=0126, b=02713, c=07325603

a=86, b=1483, c=1944451

a=0x56, b=0x5cb, c=0x1dab83

a=0X56, b=0X5CB, c=0X1DAB83

十进制数字没有前缀,所以不用加#。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加#,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。

c语言8进制数与16进制数,C语言中的二进制数、八进制数和十六进制数相关推荐

  1. C语言快速互转HEX(16进制)和原始字符串/数组

    C语言快速互转HEX(16进制)和原始字符串/数组 缘由 这个起因是昨晚群里有人在讨论怎么把字符串转成HEX方法最佳,讨论到最后变成哪种方法效率最优了.毕竟这代码是要在MCU上面跑的,要同时考虑到时间 ...

  2. 10进制数转16进制

    已知:十进制数123被转换为十六进制数7B.这个转换过程如下:将123除以16,余数为11(十六进制的B)商为7.继续将7除以16,余数为7,商为0.因此7B就是123的十六进制数. //10进制数转 ...

  3. 【进制转换】如何使用C++将一个十进制数转为16进制?

    题目 题目描述 请从键盘读入一个非负整数n(n是一个不超过18位的正整数),将n转换为16进制! 注意:16进制即逢16进1,每一位上可以是从小到大为0.1.2.3.4.5.6.7.8.9.A.B.C ...

  4. java10进制数和16进制数字相互转换

    1 将java10进制数字转换为16进制 String hex= Integer.toHexString(numb); 2 将java 16进制字符转换为10进制数 BigInteger bigint ...

  5. 面试题--位操作--将十进制数转换为16进制字符串输出

    这是一道面试题: 编程实现将十进制数转换为16进制输出,不得使用任何已定义的库函数,比如string,math等. char * get16String(long num) { int i = 0; ...

  6. Bailian2798 2进制转化为16进制【进制】

    2进制转化为3进制 描述 输入一个2进制的数,要求输出该2进制数的16进制表示. 在16进制的表示中,A-F表示10-15 输入 第1行是测试数据的组数n,后面跟着n行输入.每组测试数据占1行,包括一 ...

  7. Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    文章目录 前言 简述 ASCII GBK Unicode UTF-8 应用场景 开发环境 编码转换 16进制数值转换为16进制字符 16进制数值转化为字符串 16进制字符串转换为Unicode字符串 ...

  8. 10进制转换成16进制

    更新中......... 任意2-36进制数转化为10进制数. 建议自己写函数,代码如下: int Atoi(string s,int radix) //s是给定的radix进制字符串 {int an ...

  9. Javascript 10进制转16进制补0 ,16进制转10进制

    Javascript 10进制转16进制补0 ,16进制转10进制 10进制转16进制补0 16进制转10进制 10进制转16进制补0 // 10进制转16进制补0 function dec2hex( ...

  10. 将时间转换为16进制字符串或16进制小端模式byte数据

    1.将String类型的时间转换 1>String类型时间转换为Date类型的时间 2>时间转换为时间戳 3>时间戳转换为16进制字符串 4>16进制字符串转换为16进制小端模 ...

最新文章

  1. C#复制数组的两种方式,以及效率比较
  2. 长文 | 腾讯提出 AI For FEW 构想,呼吁人工智能为地球思考
  3. ENVI帮助研究人员发现金矿
  4. 世界上没有后悔药,时间匆匆,从关注它们开始......
  5. angularJS中,怎么阻止事件冒泡
  6. python画圣诞树代码解读_实战 | 教你用Python画各种版本的圣诞树
  7. Linux中JBOSS 安装
  8. Android 开发之 fill_parent、wrap_content和match_parent的区别
  9. hook原理介绍与简单实例
  10. Intellij mac快捷键
  11. 开发者的固化思维及解决办法
  12. linux tar zcxf,tar/gzip/zip文件打包、压缩命令
  13. 阿拉丁2022 年度小程序白皮书发布,8 亿 DAU 再现小程序繁荣生态
  14. ABP框架系列之三十一:(Localization-本地化)
  15. MATLAB下批量修改图片名称
  16. 我的2021年终回顾:一如少年,眼眸有星辰,心中有山海
  17. 2019.3.27个人赛
  18. 【MySQL】Schema与数据类型优化
  19. 用一个比喻来解释对 同步 异步 阻塞 非阻塞 轮询 回调 的理解
  20. 时域测量与频域测量方法的分析

热门文章

  1. While()和scanf的搭配使用问题
  2. 医学考研狗西医综合从小白到251+的秘籍
  3. Android两个小Demo之电话拨号器和短信发送器
  4. 【独家直播】2010 跨界实践 绿色增长 第五届中国互联网站长年会
  5. 虚拟服务器 没效果,服务器虚拟内存设置了没效果
  6. java计算机毕业设计台球收费管理系统设计与实现(附源码、数据库)
  7. java unsafe 详解_死磕 java魔法类之Unsafe解析
  8. C语言学习(一.C语言概述)
  9. 中国商用密码算法SM4
  10. Diffie-Hellman 组解释