我认为你在这里混合了概念。
在内存中,整数值总是二进制的,我们称之为原生格式。 st_mode 是 mode_t 类型,并且该类型是未指定的整数类型,可能是 int。
base 的概念,即十进制、八进制或十六进制,仅当您将内存中的本机格式的数字转换为文本表示(或从文本转换为本机)时才有用。
例如:
int x = 42;
将数字 42 分配给整数变量。由于源代码是文本,所以42作为文本输入,我们知道它是一个十进制值(无前缀)。但请注意,我们没有为变量指定基数:它没有基数。
这个其他代码:
int x = 0x2A;
完全等价。它使用十六进制常量0x2A 而不是十进制常量42,但这是相同的,x 在两种情况下都得到相同的值。同样:
int x = 052;
也是等价的,但使用八进制常数。
现在到您的代码。当你这样做时:
printf("%d", file.st_mode);
33188
您告诉程序将该变量的值输出为十进制数。请记住,printf 将数字从本机格式转换为文本,因此该文本的基础很重要。如果您希望将值视为八进制,只需编写:
printf("%o", file.st_mode);
100644
或十六进制:
printf("%x", file.st_mode);
81A4
八进制的好处在于它代表每个八进制数字正好 3 位(十六进制每个数字 4 位),因此通过一些练习,您可以在不计算的情况下看到这些位。
例如,您的st_mode 是十进制的33188 或八进制的0100644。十进制什么也没告诉我,但八进制确实意味着什么,因为我记得最后 9 位(3 个八进制数字)是权限:3 位用于所有者,3 位用于组,3 位用于其他。所以:
* Owner: 6 that is rw-
* Group: 4 that is r--
* Other: 4 that is r--
顺便说一句,最后一个是这个常数:
#define S_IFREG 0100000
这只是意味着它是一个常规文件。