故事的起因是今天在群里看到有人发来的问题
//原题目
int main() {
int a = 0123;
printf("%d ", a);
int b = a << 2, c = a >> 2;
printf("a=%d,b=%d,c=%d\n", a, b, c);
return 0;
}
刚拿到题目时,我也有点懵,0123的二进制不应该是 0000 0001 0010 0011 吗?
为什么左移两位后会变成了 [0000 0000 0101 0011]2 = [83]10 了呢?
我在我的环境上调试了一下过程,如下图所示
发现 a 居然是[0053]16 = [0000 0000 0101 0011]2,并非我所想的 0000 0001 0010 0011
经过一番研究后发现是C语言的进制问题,这里的 0123是 八进制
在 计算机中,整数可以使用多种进制表示,包括 十进制、八进制、十六进制和 二进制。
以下是C语言为实例的每种进制的表示方法:
0
前缀开头。0-7
,否则会引发错误0x
或 0X
前缀开头。0-9
和字母 A-F
(不区分大小写)来表示0b
或 0B
前缀来表示二进制数 以下为代码实例
#include<stdio.h>
int main() {
int a = 123; // 十进制 123
int b = 0123; // 八进制 0123,等于十进制 83
int c = 0x1A3; // 十六进制 0x1A3,等于十进制 419
int d = 0b1011; // 二进制 1011,等于十进制 11
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
return 0;
}
进制 | 表示方法 | 示例 |
---|---|---|
十进制 | 默认,无需前缀 | int a = 123; |
八进制 | 前缀 0 | int b = 0123; |
十六进制 | 前缀 0x 或 0X | int c = 0x1A3; |
二进制 | 0b 或 0B | int d = 0b1011; |