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

标签 c printf constants system-calls

<分区>

C 函数 printf 似乎根据是否存在前导零来打印不同的值。

我试图确定 Linux“开放”系统调用中模式参数的数值。

printf("模式:%d\n",S_IRWXU);
printf("模式:%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 %d 带有前导零的错误值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294478/

相关文章:

c - 使用宏获得的输出说明

c - 彩色的 printf 语句

c - C 中带有 const 变量的数组大小

c - 以编程方式从控制台屏幕缓冲区大小设置禁用 "Wrap text output on resize"(C)

c - 执行 strstr() 函数时出错

c - 使用结构的 C 代码错误

c++ - 在 C++ 中多线程时与 cout 和 printf 的区别

c++ - const 成员可以在 c++ 构造函数中初始化吗?

c++ - 关键字 "const"是如何工作的?

c - 使用openmp优化MSE算法