2011-09-16 44 views
0

這本書告訴寫作:靜態無符號整型foo和更高版本如果(foo> 0)?

static unsigned int foo; 

後來

if(foo > 0) 
{ 

是錯誤的,它會導致一個很難找到的bug。 這是爲什麼?

在x86彙編語言編程有符號的算術運算指令和 也無符號運算指令, JG JL < -signed算術 JB JA < - 無符號的指令。

因此,編譯器可以直接組裝,如果(FOO> 0)無符號說明 說法是不是?有人可以解釋它是如何提前工作的嗎?

是該指令錯了嗎?或者如果「C++」在 這種情況下「C++」嚴格的區別?請解釋。

在這裏,我們有一個直接的值進行比較無符號的變量。在這種情況下編譯器 裏面發生了什麼?

當我們比較無符號值會發生什麼符號值?那麼編譯器會選擇哪些指令,簽名指令或未簽名​​的指令?

--thanks在advance--

回答

2

這個問題不應該在彙編的層次來回答,但還是老樣子對C/C++語言水平。在大多數體系結構中,不可能比較已簽名和未簽名的數字,而c/C++不會促進這種比較。相反,有關於將其中一個操作數轉換爲另一個操作數以便比較它們的規則 - 例如參見this question

關於與文字比較 - 典型的做法(如您所做的)沒有錯,但你可以做的更好 - 按照C++標準:

2.13.1.1一個整數文字是一個沒有期限 或指數部分數字序列。整數字面量可以有一個前綴,用於指定其基址和一個指定其類型的後綴 。數字序列的詞彙上的第一個 數字是最重要的。十進制 整數字面量(十進制數)以0以外的數字開始,並以十進制數字序列開頭。八進制整數字面(基 8)開始於數字0和由八進制 digits.22的序列的)的十六進制整數文字(基16)開始以0x 或0X和由十六進制數字序列的,其中包括 的十進制數字和字母a到f和A到F以及 十進制值十到十五。 [例如:編號12可以是 寫成12,014或0XC。 ]

2.13.1.2類型字面的整數的取決於它的形式,值, 和後綴。如果它是十進制的,並且沒有後綴,那麼它的第一個 這些類型的值可以表示爲:int,long int;如果 該值不能表示爲long int,則行爲爲 未定義。如果它是八進制或十六進制並且沒有後綴,則它具有可以表示其值的第一種類型:int, unsigned int,long int,unsigned long int。如果後綴爲u或 U,則其類型是第一種類型,其值可以是 :unsigned int,unsigned long int。如果後綴爲l 或L,那麼它的類型就是這些類型中的第一個,其值可以是 :long int,unsigned long int。如果後綴爲ul,lu, uL,Lu,Ul,lU,UL或LU,則其類型爲unsigned long int。

如果你想確定你的文字類型(因此comaprison類型)添加描述的後綴,以確保正確的文字類型。

還值得注意的是,字面0實際上不是十進制但是八進制 - 它似乎沒有改變任何東西,但是相當意外 - 我錯了嗎?

總結 - 這是沒有錯寫這樣的代碼,但你應該remeber,在某些條件下可能表現反直覺的(或至少阻止數學;)

+0

關於文字上的'0',是:6.4.4.1第1段定義了八進制常數:0;八進制常數八進制數字「,所以普通的」0「將是八進制常數而不是十進制數。當然,這不重要。 –