07-c语言进制
本文最后更新于 2026-02-26,文章内容可能已经过时。
C语言中,进制表示规则为:八进制以
0开头(如015),十六进制以0x或0X开头(如0x2A),十进制无前缀(如128),二进制C99标准支持0b前缀(如0b1010)但非所有编译器兼容;进制转换时,二进制转八进制需每三位一组(从右向左分组),转十六进制需每四位一组,十进制转换采用"除基取余法"(如十进制转二进制用除2取余),这些规则对底层编程和数据处理至关重要。
一、C语言中常见进制的表示方法
1. 二进制(Binary)
-
组成:由0和1组成
-
C语言表示:C99标准支持
0b前缀(如0b1010),但并非所有编译器都支持 -
示例:
int a = 0b1010; // 二进制1010,十进制为10
2. 八进制(Octal)
-
组成:由0~7八个数字组成
-
C语言表示:必须以
0开头(数字0,不是字母o) -
示例:
int a = 015; // 八进制15,十进制为13 int b = -0101; // 八进制101,十进制为-65 int c = 0177777; // 八进制177777,十进制为65535 -
非法示例:
int m = 256; // 无前缀0,相当于十进制 int n = 03A2; // A不是有效的八进制数字
3. 十进制(Decimal)
-
组成:由0~9十个数字组成
-
C语言表示:没有任何前缀
-
示例:
int a = 128; int b = +234; int c = -278;
4. 十六进制(Hexadecimal)
-
组成:由数字0
9和字母AF或a~f(不区分大小写)组成 -
C语言表示:必须以
0x或0X开头 -
示例:
int a = 0X2A; // 十六进制2A,十进制为42 int b = -0XA0; // 十六进制A0,十进制为-160 int c = 0xffff; // 十六进制ffff,十进制为65535 -
非法示例:
int m = 5A; // 没有前缀0X,是无效数字 int n = 0X3H; // H不是有效的十六进制数字
二、C语言中进制的输出格式
| 类型 | 八进制 | 十进制 | 十六进制(小写) | 十六进制(大写) |
|---|---|---|---|---|
| short | %ho | %hd | %hx | %hX |
| int | %o | %d | %x | %X |
| long | %lo | %ld | %lx | %lX |
注意:
- 十六进制数字的表示用到了英文字母,有大小写之分
%hx、%x和%lx中的x小写,表示以小写字母形式输出十六进制数%hX、%X和%lX中的X大写,表示以大写字母形式输出十六进制数- 八进制和十进制数字不区分大小写,格式控制符都用小写形式
三、进制转换方法
1. 二进制与其他进制转换
二进制转八进制
- 每三位一组,从右往左分组,不足三位左边补0
- 例如:
01101011(二进制)→0153(八进制)
二进制转十六进制
- 每四位一组,从右往左分组,不足四位左边补0
- 例如:
01101011(二进制)→0x6B(十六进制)
2. 八进制与二进制转换
- 八进制转二进制:每一位八进制数转换为三位二进制数
- 例如:
721(八进制)→111010001(二进制)
- 例如:
3. 十六进制与二进制转换
- 十六进制转二进制:每一位十六进制数转换为四位二进制数
- 例如:
7AB1(十六进制)→0111101010110001(二进制)
- 例如:
4. 十进制与其他进制转换
- 十进制转二进制:除2取余法,从低位到高位
- 例如:
25(十进制)→11001(二进制)
- 例如:
- 十进制转八进制:除8取余法,从低位到高位
- 例如:
10(十进制)→12(八进制)
- 例如:
- 十进制转十六进制:除16取余法,从低位到高位
- 例如:
10(十进制)→A(十六进制)
- 例如:
四、进制转换口诀
"转2排余,转16排余,转8排余,转几除几,后余在高位。"
- 转二进制:用除2取余法,从低位到高位
- 转八进制:用除8取余法,从低位到高位
- 转十六进制:用除16取余法,从低位到高位
- 转十进制:各位数分别乘以基数的幂次方再求和
五、进制转换函数
ltoa()函数
-
原型:
char *ltoa(long value, char *string, int radix) -
功能:将长整型数值转换为2至36进制的字符串
-
示例:
long num = 159; char str[32]; ltoa(num, str, 10); // 将num以10进制方式转换为串str,str='159' ltoa(num, str, 2); // 将num以2进制方式转换为串str,str='10011111'
六、常见问题与注意事项
-
C语言不支持直接表示二进制:C99标准支持
0b前缀,但不是所有编译器都支持。在C语言中,我们通常通过printf的格式控制符来输出二进制,但不能用0b前缀直接表示。 -
进制表示的前缀:
- 八进制:以
0开头 - 十六进制:以
0x或0X开头 - 十进制:无前缀
- 八进制:以
-
进制输出的前缀:
- 八进制:输出时没有前缀,与十进制、十六进制难以区分
- 十六进制:输出时通常会添加
0x前缀,便于区分
-
进制转换的通用方法:
- 二进制是计算机内部使用的基本进制
- 八进制和十六进制主要用于简化二进制表示
- 十六进制在计算机系统中应用最广泛
七、实际应用示例
#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
总结
C语言支持八进制、十进制和十六进制的直接表示,但不支持二进制的直接表示(C99标准支持0b前缀,但并非所有编译器都支持)。进制转换是计算机编程中的基本技能,理解不同进制之间的转换方法对于底层编程、硬件操作和数据处理非常重要。通过掌握进制表示、转换规则和C语言中的使用方法,可以更好地理解计算机系统的工作原理。
- 感谢你赐予我前进的力量

