簡體   English   中英

靜態unsigned int foo以及后來if(foo> 0)?

[英]Static unsigned int foo and later if ( foo >0 )?

這本書告訴寫作:

static unsigned int foo;

然后

if( foo > 0)
{

這是錯誤的,它會導致很難找到錯誤。 這是為什么?

在x86匯編語言編程中,有帶符號的算術指令和無符號算術指令,JG JL <有符號算術JB JA < - 無符號指令。

所以編譯器只能組裝if(foo> 0)語句與無符號指令不是嗎? 有人可以提前解釋它是如何工作的嗎?

那條指令錯了嗎? 或者,如果“C”存在差異,那么“C ++”在這種情況下是嚴格的? 請解釋。

這里我們將無符號變量與立即值進行比較。 在這種情況下,編譯器內部發生了什么?

當我們將有符號值與無符號值進行比較時會發生什么? 那么編譯器會選擇哪些指令,簽名指令或未簽名​​指令?

- 提前致謝 -

這個問題不應該在匯編程序的水平上回答,而應該在c / c ++語言級別上回答。 在大多數體系結構中,不可能比較有符號和無符號數,而c / c ++不利於這種比較。 相反,有關於將其中一個操作數轉換為另一個操作數以便比較它們的規則 - 請參閱例如此問題的 aswers

關於與文字進行比較 - 這樣做的典型方式(正如你所做的那樣)並沒有錯,但你可以做得更好 - 根據c ++標准:

2.13.1.1整數文字是一個沒有句點或指數部分的數字序列。 整數文字可以具有指定其基數的前綴和指定其類型的后綴。 數字序列的詞匯第一個數字是最重要的。 十進制整數文字(十進制)以0以外的數字開頭,包含一個十進制數字序列。 八進制整數文字(基數為8)以數字0開頭,包含八進制數字序列.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,U1,lU,UL或LU為后綴,則其類型為unsigned long int。

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

值得注意的是,文字0實際上不是十進制而是八進制 - 它似乎沒有改變任何東西,但是非常意外 - 或者我錯了?

總而言之 - 編寫這樣的代碼並沒有錯,但你應該記住,在某些情況下可能會表現出反直覺的(或者至少是反數學的);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM