跟下面的代码搞混了
#include <stdio.h>
void main()
{
int a=0100;
printf("%x",a);
}
我得到的值是40。
谁能给我解释一下这是怎么回事?注意:当我在数字1之前删除数字0时,它是正确的64,当100转换为十六进制时。
Codepad链接到上面的代码
在C语言中,前缀为0
的常数为八进制常数。0100以8为底等于1000000以2为基数,十六进制是40,以10为基数是64。所以你的程序正在打印它应该打印的内容
这里
int a=0100;
您正在分配一个八进制值,该值以10为基数为64,40为十六进制。
以0
开头的整数字面值在c中是八进制的。
c中的0前缀表示八进制,而不是十进制。
http://en.cppreference.com/w/cpp/language/integer_literal
- 小数字面值是非零十进制数字(1、2、3、4、5、6、7、8、9),后面跟着0个或多个十进制数字(0、1、2、3、4、5、6、7、8、9)
- 八进制文字是数字零(0)后面跟着零或更多八进制(0,1,2,3,4,5,6,7)
- 十六进制文字是字符序列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