C printf %d 带有前导零的错误值?

C printf %d incorrect value with leading zeros?

C 函数 printf 似乎根据是否存在前导零来打印不同的值。

我试图确定 Linux 'open' 系统调用中模式参数的数值。

printf("mode:%d\n",S_IRWXU);
printf("mode:%d\n",00700);

都给了我448,而

printf("mode:%d\n",700); 给了我 700,正如我对两者的期望。

这是怎么回事?

我正在使用 gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609

带有一个或多个前导零的数值常量是 八进制常量,而没有前导零的数值常量是 十进制常量 并且前导 0x 的是 十六进制常量 。这在任何上下文中都成立,无论值是传递给 printf 还是任何其他函数。

printf 的情况下,您使用的是 %d 格式说明符,它以十进制形式打印值。如果您传入一个八进制常量,您将看到该八进制数的十进制值。在这个例子中,0700b8 == 7 * 8^2 + 0 * 8^1 + 0 * 8^0 == 7 * 64 == 448b10

如果您要处理文件权限,这些值通常表示为八进制,因此您应该始终使用前导 0。