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

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

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

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的一个是hex常量 。 这适用于任何上下文,无论值是传递给printf还是任何其他函数。

对于printf ,您使用的是%d格式说明符,它以十进制格式输出值。 如果传入八进制常量,则会看到该八进制数的十进制值。 在此示例中,0700b8 == 7 * 8 ^ 2 + 0 * 8 ^ 1 + 0 * 8 ^ 0 == 7 * 64 == 448b10

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