2011-06-15 63 views
8

好吧...所以我有一個愚蠢的想法,並試圖將0123值放入一個整數,只是好奇看看會發生什麼,我認爲當我打印的價值,我會得到123,而我得到了83。 ..有什麼想法爲什麼?在編譯器/內存中發生了什麼使得這個值變成了83?當C/C++中的數字常量前綴爲0時,這意味着什麼?

我在C++和C中用GCC編譯器試過這個,並且試着用一個浮點數來產生相同的結果。

回答

2

0123是一個八進制常數(基數爲8)。 83是十進制等值。

8
+0

+1讓我大聲笑 - 有用的鏈接 – CurtisJC 2011-06-15 23:24:57

+1

娛樂比bemusement更好。 :-) – 2011-06-15 23:28:21

+0

'要寫八進制數字,在數值前加上0. ... 要以八進制寫入數字,請在數值前加上0x或0X。 'doh! – mrk 2011-06-15 23:28:26

3

這是因爲任何以0開頭的數字都被認爲是八進制數(基數8)而不是小數。

同樣的事情,如果你開始以0x你會得到十六進制

+0

十六進制信息+1 - 可能會有幫助 – CurtisJC 2011-06-15 23:24:26

3

前導0表示「八」號。所以它變成了1 * 8^2 + 2 * 8^1 + 3 * 8^0 = 83

+0

它是領先的'0'(零),而不是領先的'O'(o)。 – 2011-06-15 23:28:38

+0

當然你是非常正確的,只是意識到我的錯誤,並回來編輯。試圖給自己一個愚蠢的-1 :-) – 2011-06-16 00:03:36

1

根據C++標準[lex.icon]整數文字可以分爲3種類型:小數文字,八進制文字和十六進制文字,其每一個可以具有用於signess和長度類型後綴

十進制文字必須開始一個非零數字,而八進制文字與0和十六進制文字開始有0X和0X,後前綴(對於八進制文字和十六進制文字)任何不能在對應基地中表示的數字都會觸發編譯錯誤(例如09導致error C2041: illegal digit '9' for base '8'和其他編譯器prog.cpp:6:15: error: invalid digit "9" in octal constant),因爲我如果整型文字不能表示,程序就會變形。