本文最后更新于 2026-02-26,文章内容可能已经过时。

C语言中,进制表示规则为:八进制以0开头(如015),十六进制以0x0X开头(如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)

  • 组成:由数字09和字母AF或a~f(不区分大小写)组成

  • C语言表示:必须以0x0X开头

  • 示例

    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'
    

六、常见问题与注意事项

  1. C语言不支持直接表示二进制:C99标准支持0b前缀,但不是所有编译器都支持。在C语言中,我们通常通过printf的格式控制符来输出二进制,但不能用0b前缀直接表示。

  2. 进制表示的前缀

    • 八进制:以0开头
    • 十六进制:以0x0X开头
    • 十进制:无前缀
  3. 进制输出的前缀

    • 八进制:输出时没有前缀,与十进制、十六进制难以区分
    • 十六进制:输出时通常会添加0x前缀,便于区分
  4. 进制转换的通用方法

    • 二进制是计算机内部使用的基本进制
    • 八进制和十六进制主要用于简化二进制表示
    • 十六进制在计算机系统中应用最广泛

七、实际应用示例

#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语言中的使用方法,可以更好地理解计算机系统的工作原理。