[2022/3/2]浅谈C语言变量的进制
前段时间,一位同学问我一段代码
int a = 0420;
int b = 0;
scanf("%d",&b);
if(a == b)
{
printf("yes");
}
else
{
printf("no");
}
这位同学输入的值是0420,但程序输出为no
如图所示
为什么会这样呢?
我们尝试再次输出一下a的数值
在
int a=0420;
后添加如下代码
printf("a=%d",a);
结果如下
a的值是272
原因就在于定义a时写的是
int a =0420;
“罪魁祸首”就是最开始的那个“0”
大家观察这两张图,可以发现a=07时编译器给的颜色为紫色
但a=08时编译器却是默认颜色
我们尝试运行后者
编译器报错,报错信息意思为“八进制常量中的无效数字“8”
破案了,问题就出在这里,“八进制”
这也就意味着在初始化变量前如果有0那么这个数就是以8进制储存的
如图,8进制的420转化为10进制,值为272,与最开始的测试相符合
那么除了八进制、十进制,c语言还支持哪些进制?
- 二进制
二进制由 0 和 1 两个数字组成,使用时必须以0b或0B开头,且不区分大小写
例如
//合法的二进制
int a = 0b101; //换算成十进制为 5
int b = -0b110010; //换算成十进制为 -50
int c = 0B100001; //换算成十进制为 33
//非法的二进制
int m = 101010; //无前缀 0B,相当于十进制
int n = 0B410; //4不是有效的二进制数字
- 十六进制
十六进制由数字 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也可以使用16进制进行登录
作者:WWQ