1

对以下代码感到困惑。

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

我得到的值是 40。

有人可以解释一下这里发生了什么吗?

注意:当我在数字 1 之前删除数字 0 时,当 100 转换为十六进制时,它会出现 64,这是正确的。

上面代码的键盘链接

4

4 回答 4

2

在 C 中,以 a 为前缀的常量0八进制常量。以 8 为底的 0100 是以 2 为底的 1000000,即十六进制的 40,以 10 为底的 64。所以你的程序正在打印它应该打印的内容。

于 2016-11-06T12:03:31.440 回答
1

这里

int a=0100;

您正在分配一个八进制值,即以 10 为底的 64,而 40 是十六进制。

以 a 开头的整数文字0在 C 中是八进制的。

于 2016-11-06T12:03:15.463 回答
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)
于 2016-11-06T12:03:21.480 回答
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
于 2016-11-06T12:03:55.593 回答