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

时间:2017-11-14 20:17:25

标签: c printf constants system-calls

C函数printf似乎打印不同的值,具体取决于是否存在前导零。

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

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

两人都给了我448,而

{{1}}给了我700,正如我所期望的那样。

这里发生了什么?

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

1 个答案:

答案 0 :(得分:3)

具有一个或多个前导零的数值常量是八进制常数,而没有前导零的数字常量是十进制常量,一个带有前导{{1} }是十六进制常量。这适用于任何上下文,无论值是传递给0x还是任何其他函数。

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

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