我認爲你在這裏混合概念。
在內存中,整數值總是二進制的,我們稱之爲本機格式。 st_mode
是mode_t
類型,該類型是未指定的整數類型,可能是int
。
基的概念,即十進制,八進制或十六進制,只有當你在機格式隱蔽數在存儲器中的文本表示,(或從文本返回到天然的)是有用的。
例如:
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
約八進制的好處是,itrepresents每八進制數字恰好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--
BTW,最後1是本恆:
#define S_IFREG 0100000
,僅表示這是一個普通文件。