对以下代码感到困惑。
#include <stdio.h>
void main()
{
int a=0100;
printf("%x",a);
}
我得到的值是 40。
有人可以解释一下这里发生了什么吗?
注意:当我在数字 1 之前删除数字 0 时,当 100 转换为十六进制时,它会出现 64,这是正确的。
对以下代码感到困惑。
#include <stdio.h>
void main()
{
int a=0100;
printf("%x",a);
}
我得到的值是 40。
有人可以解释一下这里发生了什么吗?
注意:当我在数字 1 之前删除数字 0 时,当 100 转换为十六进制时,它会出现 64,这是正确的。
在 C 中,以 a 为前缀的常量0
是八进制常量。以 8 为底的 0100 是以 2 为底的 1000000,即十六进制的 40,以 10 为底的 64。所以你的程序正在打印它应该打印的内容。
这里
int a=0100;
您正在分配一个八进制值,即以 10 为底的 64,而 40 是十六进制。
以 a 开头的整数文字0
在 C 中是八进制的。
c 中的 0 前缀表示八进制,而不是十进制。
http://en.cppreference.com/w/cpp/language/integer_literal
- decimal-literal 是一个非零十进制数字 (1, 2, 3, 4, 5, 6, 7, 8, 9),后跟零个或多个十进制数字 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
- 八进制文字是数字零 (0) 后跟零个或多个八进制数字 (0, 1, 2, 3, 4, 5, 6, 7)
- hex-literal 是字符序列 0x 或字符序列 0X 后跟一个或多个十六进制数字(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c , C, d, D, e, E, f, F)
- binary-literal 是字符序列 0b 或字符序列 0B 后跟一个或多个二进制数字 (0, 1)
0100是一个八进制值,因为它有前缀0
。
0100 in octal (base 8)
^~~~(8^2)*1
is same as
0x40 in hexadecimal (base 16)
^~~~(16^1)*4 // %x is for hexadecimal format
is same as
64 in decimal (base 10)
printf("%o %x %d",a, a, a); // prints 100 40 64