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<stdio.h>
intmain()
{
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);//以十六进制形式输出(字母大写)return0;
}

运行结果:

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<stdio.h>
intmain()
{
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);//以十六进制形式输出(字母大写)return0;
}

运行结果:

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语言中的二进制数、八进制数和十六进制数相关推荐

  1. c语言能对16进制数比较大小,C语言中的二进制数、八进制数和十六进制数

    C语言中的整数除了可以使用十进制,还可以使用二进制.八进制和十六进制. 二进制数.八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一个二进制.八 ...

  2. c语言8进制数与16进制数,C语言中的二进制数、八进制数和十六进制数

    C语言中的整数除了可以使用十进制,还可以使用二进制.八进制和十六进制. 二进制数.八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一个二进制.八 ...

  3. 第三章 变量和数据类型_C语言中的二进制数、八进制数和十六进制数的输入和输出

    二进制数.八进制数和十六进制数的输入 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一个二进制.八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特 ...

  4. 二进制数、八进制数、十六进制数与…

    整数在内存中是以补码的形式存放的.(符号位1表示负,0表示正) 正数的补码和源码相同:负数的补码=该数绝对值的二进制数-取反-加1: 一个有符号的int型变量(当时2个字节时)取值范围:-2∧15~( ...

  5. 计算机二进制基础列式,计算机基础;十进制数100对应的二进制数、八进制数和十六进制数分别是...

    中计数采用了多种记数制,比如:十进制,六十进制(六十秒为一分,六十分为一小时,即基数为60,运算规则是逢六十进一),--.在计算机中常用到十进制数.二进制数.八进制数.十六进制数等,下面就这几种在计算 ...

  6. 输出一个整数的二进制数、八进制数、十六进制数,java实现

    需求:键盘录入一个整数,输出这个整数的二进制数.八进制数.十六进制数. 分析: 1.十进制转二进制: 十进制数除以2取余,倒着输出.把取得的余数放在数组中,从后往前遍历数组 2.十进制转八进制: 十进 ...

  7. java 学习 输出一个整数的二进制数、八进制数、十六进制数。

    使用简单的for循环进行 一个十进制数 转换为二进制数.八进制数.十六进制数. (2)十进制转二进制 十进制整数转二进制数:"除以2取余,逆序排列"(除二取余法) (2)十进制转八 ...

  8. C语言中的有符号数和无符号数之间转换

    C语言中的有符号数和无符号数之间转换 我们都知道C语言中有有符号数和无符号数两种整数表示方法,并且支持相互转换. 那么具体相互转换有什么规则,我们今天来了解一下: 在C语言中当声明一个像12345或0 ...

  9. C语言中的二进制数,八进制数,十进制数,十六进制数

    C语言标准中,整数可以直接使用八进制.十进制.十六进制三种表示,二进制标准没有支持,但是部分编译器提供支持. 进制的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式.但是,表示一 ...

最新文章

  1. linux删除目录是显示非空,Linux删除非空目录
  2. Linux系统常用的基本命令【转载CSDN象在舞】
  3. mysql分库分表面试_【53期】面试官:谈一下数据库分库分表之后,你是如何解决事务问题?...
  4. Spring Security——异常信息本地化
  5. leetcode python3 简单题70. Climbing Stairs
  6. 虚拟机上安装Linux时出现的问题及解决方法
  7. python中json.dumps使用的坑以及字符编码
  8. 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走
  9. Excel学习笔记:P22-时间格式、工龄与工时计算
  10. 临床试验中edc录入_一文了解EDC临床试验数据采集系统
  11. DNS详解,权威DNS,递归DNS,转发DNS,公共DNS
  12. 服务器2012系统登录密码忘记6,Server2012忘记管理员密码的处理方法
  13. html尖角效果,CSS3之尖角标签_html/css_WEB-ITnose
  14. 入职半年后,我升到了管理岗
  15. JetBrain软件不同版本下载
  16. 各大厂家人脸识别对比
  17. 【汇正财经】股票成交原则有哪些?竞价交易呢?
  18. 系统System文件损坏或丢失的简单解决办法
  19. 笔记本 windows10使用耳机看视频 刚开始会有几秒的无声
  20. qq农场私服php源代码,仿QQ农场源码、QQ牧场源代码(整合UCHOME)

热门文章

  1. strchr函数的实现
  2. 维度诅咒_专职开发人员的“诅咒”
  3. MES项目参观交流会
  4. Kaldi 实战学习(1)说话人识别小例子(egs/aishell/v1)
  5. 【NOIP模拟】素数密度
  6. 公网域名访问内网IP跨域
  7. 2022 IoTDB Summit:京东刘刚《Apache IoTDB 在京东万物互联场景中的应用》
  8. 打字大师 3 Pro Master Of Typing 3.8.3 特别版 Mac 打字练习软件
  9. [计算机视觉] A4纸边缘检测
  10. android异步任务载入数据界面实现