2010-04-18 42 views
6

我的代碼中有很多#define。現在一個奇怪的問題已經出現。C的值定義意外變化

我有這樣的:

#define _ImmSign 010100 

(我試圖模擬一個二進制數)

很顯然,我預計的數量成爲10100但是,當我使用數字已經變成4160.

這裏發生了什麼事?我該如何阻止它?

ADDITIONAL

好了,所以這是由於解釋本爲一個八進制的語言。然而,是否有一些聰明的方法來強制語言將數字解釋爲整數?如果以0開頭定義八進制和0X定義十六進制現在我想起來了......

開始了 0
+3

010100八進制爲0×1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160。 – 2010-04-18 21:20:45

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY 這可能對您有用。雖然C++,但我認爲它只是預處理器 – Anycorn 2010-04-18 21:27:59

+0

@aaa thx的建議,但我不認爲我被允許使用第三方庫。 – NomeN 2010-04-18 21:32:51

回答

1

如果您願意寫不可移植的代碼和使用gcc,可以使用binary constants extension

#define _ImmSign 0b010100 
+1

argh ...我已經搜索了這個多次,但它從來沒有出現在谷歌。太有趣了! – NomeN 2010-04-18 22:31:08

13

整數文字被解釋爲八進制,不是小數,以同樣的方式開始0x該整數字面解釋作爲十六進制。

刪除前導零,你應該很好去。

還要注意,以下劃線開頭的標識符後面跟着大寫字母或其他下劃線是爲實現保留的,所以您不應在代碼中定義它們。

+0

快速回答!是否有另一種方法來阻止它,然後去除前導零? – NomeN 2010-04-18 21:21:37

+2

@NomeN:No;這是該語言的基本部分。 – 2010-04-18 21:23:18

4

用0前綴一個整數使其成爲八進制數而不是十進制數,而010100的八進制數是十進制的4160。

+0

另一個快速回復,thx!有沒有解決這個問題的另一種方法,而不是刪除前導0? – NomeN 2010-04-18 21:22:42

+0

不是我所知道的。 – Maulrus 2010-04-18 22:17:37

2

C中沒有二進制數的語法,至少沒有一些編譯器擴展。你看到的是010100被解釋爲八進制(基數8)數字:它在數字文字以0開始時完成。

2

010100被C視爲八進制數,因爲前導字母爲0.八進制10100爲4160.

0

八:-)另一個線程

您可能會發現these macros helpful以1和0的形式表示具有十進制或八進制數字的二進制數字。他們確實處理前導零,但不幸的是,你必須根據你是否有前導零來選擇正確的宏名稱。不完美,但希望有所幫助。