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。
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。