杂谈

前段时间,一位同学问我一段代码

int a = 0420;
int b = 0;
scanf("%d",&b);
if(a == b)
{
    printf("yes");
}
else
{
    printf("no");
}

这位同学输入的值是0420,但程序输出为no

2022-03-02.png

如图所示
为什么会这样呢?
我们尝试再次输出一下a的数值

int a=0420;

后添加如下代码

printf("a=%d",a);

结果如下

2022-03-02 (3).png

a的值是272
原因就在于定义a时写的是

int a =0420;

“罪魁祸首”就是最开始的那个“0”

1.png

2.png

大家观察这两张图,可以发现a=07时编译器给的颜色为紫色
但a=08时编译器却是默认颜色
我们尝试运行后者

3.png

4.png

编译器报错,报错信息意思为“八进制常量中的无效数字“8”
破案了,问题就出在这里,“八进制”
这也就意味着在初始化变量前如果有0那么这个数就是以8进制储存的

5.png

如图,8进制的420转化为10进制,值为272,与最开始的测试相符合


那么除了八进制、十进制,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不是有效的二进制数字
  1. 十六进制

十六进制由数字 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不是有效的十六进制数字

  • 如何输出各个进制的数值?

八进制:printf("%0",a);//注意这是英文字母0,并非数字0
十进制:printf("%d",a);
十六进制:printf("%x",a);
令人意外,C语言并没有标准输出二进制的表示方法
因此需要用到函数itoa()
感兴趣的同学可以自行查阅


  • 冷知识

qq.png

QQ也可以使用16进制进行登录

This is just a placeholder img.