• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中的二进制数、八进制数和十六进制数

C语言中的二进制数、八进制数和十六进制数

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2022-04-30

匿名通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。

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

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

1) 二进制

二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头,例如:
//合法的二进制int a = 0b101;  //换算成十进制为 5int b = -0b110010;  //换算成十进制为 -50int 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;  //换算成十进制为 13int b = -0101;  //换算成十进制为 -65int c = 0177777;  //换算成十进制为 65535//非法的八进制int m = 256;  //无前缀 0,相当于十进制int n = 03A2;  //A不是有效的八进制数字

3) 十六进制

十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头,例如:
//合法的十六进制int a = 0X2A;  //换算成十进制为 42int b = -0XA0;  //换算成十进制为 -160int c = 0xffff;  //换算成十进制为 65535//非法的十六进制int m = 5A;  //没有前缀 0X,是一个无效数字int n = 0X3H;  //H不是有效的十六进制数字

4) 十进制

十进制由 0~9 十个数字组成,没有任何前缀,和我们平时的书写格式一样,不再赘述。

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

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

十进制数字没有前缀,所以不用加#。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加#,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C++常用字符串分割方法实例汇总
  • 2017-05-28C语言 位段的详细介绍
  • 2017-05-28c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)
  • 2017-05-28C语言中字符的输入输出以及计算字符个数的方法详解
  • 2022-04-30C语言fgets和fputs函数的用法详解(以字符串的形式读写文件)
  • 2017-05-28C语言中实现“17进制”转“10进制”实例代码
  • 2017-05-28C++空类详解
  • 2017-05-28C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法
  • 2017-05-28基于C++中覆盖,重载,隐藏的一点重要说明
  • 2017-05-28C语言左旋转字符串与翻转字符串中单词顺序的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言基础知识点解析(extern,static,typedef,const)
    • C和C++ const的声明差异
    • C语言程序的错误和警告
    • 解析结构体的定义及使用详解
    • short与int转换的小例子
    • 二维指针动态分配内存连续问题深入分析
    • c语言打开文件函数使用方法
    • 深入解析C++中派生类的构造函数
    • C语言中的函数指针基础学习教程
    • C语言安全编码之数值中的sizeof操作符

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有