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和那些值。