与以下代码混淆。
#include <stdio.h>
void main()
{
int a=0100;
printf("%x",a);
}
我得到的价值是40。
有人能解释我这里发生了什么吗?
注意:当我删除数字1之前的数字0然后它的64是正确的,当100被转换为十六进制时。
答案 0 :(得分:2)
在C中,以0
为前缀的常量是八进制常量。基地8的0100是
基数为2的1000000,十六进制为40,基数为10.,因此您的程序正在打印它应该的内容。
答案 1 :(得分:1)
下面
int a=0100;
您正在分配八进制值,基数10为64,而40为十六进制。
以0
开头的整数文字是C中的八进制。
答案 2 :(得分:1)
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)
答案 3 :(得分: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