【问题标题】:C printf %d incorrect value with leading zeros? [duplicate]C printf %d 带有前导零的不正确值? [复制]
【发布时间】:2017-11-14 20:17:24
【问题描述】:

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

【问题讨论】:

  • 前导 0 用于八进制。
  • @Abraham McIlvaine 考虑这个调用的输出。 printf("模式:%#o\n", 448);

标签: c printf constants system-calls


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 2016-01-15
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多