2010-07-29 48 views
5

我想比較兩個十六進制兩個十六進制值(存儲在長)以下 是我的代碼相比於C++

long constant = 80040e14; 
if(constant == 80040e14) 
    cout<<"Success"<<endl; 
else 
    cout<<"Fail!!"<<endl; 

在這段代碼中的流量控制總是返回到別的部分,任何人都可以請建議如何進行與比較。

感謝

Santhoshaķ

+0

我很驚訝,它編譯 – 2010-07-29 10:32:09

+2

@Binary杞人憂天:它編譯只能用'e'字符(因爲它被視爲指數)。對於每一個其他的十六進制字符它的編譯器錯 – Naveen 2010-07-29 10:33:56

+0

LOL ...........! – 2010-07-29 11:04:00

回答

13

前綴的常數隨加 '0x'。

你的常量只有'e',編譯器會將數字形式:NNNeEEE作爲科學記數法處理。使用'0x'前綴告訴編譯器以下字符采用十六進制表示法。

在您的代碼中,80040e14是8004000000000000000,它太大而不適合32位值,但可以適合64位值。但是,80040e14是一個浮點數,因此比較會將long轉換爲浮點數以使其與常量的類型相同,因此由於浮點代碼的複雜性,這兩個值將會不同。

+0

+1 - 這是所有的最完整的答案。 – Shaihi 2010-07-29 10:34:46

0

你想比較一個十六進制嗎?
使用0x80040e14 - >注意前綴0x讓編譯器知道它是十六進制格式。

你編寫它的方式編譯器可能會嘗試將它解析爲一個float(e意味着指數),但我沒有真正嘗試看它是如何處理它的。

+0

Gnu g ++ 4.4.3給出了這樣的警告:「隱式常量轉換中的溢出」 – Kristian 2010-07-29 10:33:07

2

爲十六進制值,你需要前綴常量0x否則e被視爲指數和值被解釋爲一個巨大的十進制值。在你的情況下,很可能這個值不能長時間存儲並溢出。由於這種溢出,您的比較檢查失敗。

3

你需要把0X在你的十六進制數的前面,C++

1

比較兩個值使用==操作符。 唯一要考慮的就是告訴編譯器,底座使用值:

  • 十進制:一如既往,你在「現實生活」做寫號。示例:1(一),2(兩個),3(三),...

  • 十六進制:您必須在值後附加0x。示例:0x01(one),0x02(two),0x03(three),...

  • Binary:Append 0b。例如:0b01(one),0xb10(two),0b11(three)。 編輯:似乎這是不正確的。不要相信這個功能。

在您的例子,只是做:

long constant = 0x80040e14; 
if(constant == 0x80040e14L) 
    cout<<"Success"<<endl; 
else 
    cout<<"Fail!!"<<endl; 
+0

C++沒有文字的二進制格式。 '0x'前綴表示十六進制,'0'前綴表示八進制數。 '0b01'和'0b11'都會產生編譯錯誤('b'是一個無效的八進制字符),'0xb10'是十進制的2832。 – Skizz 2010-07-29 10:53:45

+0

糟糕,這是我僅用於C的一個特性,我錯誤地認爲C++繼承了它。 – 2010-07-29 11:07:35

+0

它也不是C(可能是一個編譯器擴展) – MSalters 2010-07-29 11:54:45

0

80040E14是雙。當分配到一個長時間後,它變成零。 80040e14L是一個長雙。 表達

constant == 80040e14L 

促進常數長雙讓你不得不

0.0 == 80040e14