在printf语句中使用%x打印整型数据类型的值



跟下面的代码搞混了

#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

最新更新