在printf语句

时间:2016-11-06 12:00:15

标签: c octal numeral-system

与以下代码混淆。

#include <stdio.h>
void main()
{
int a=0100;
printf("%x",a);
}

我得到的价值是40。

有人能解释我这里发生了什么吗?

注意:当我删除数字1之前的数字0然后它的64是正确的,当100被转换为十六进制时。

Codepad link to above code

4 个答案:

答案 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