2015-04-15 32 views
0

示例代碼是這樣的。NDK-將負數轉換爲uint32_t得到零

{ 
    uint32_t x; 
    double y; 
    y = -1;   // any negative number; 
    x = (uint32_t)(y); 
    print_log("%u", x);// here, x will be outputed, and it's 0; 
} 

爲什麼x是0?

我在linux-gcc中運行相同的代碼,結果是不同的。

+0

演員是不必要的; 'y = x;'會隱含地進行相同的轉換。 '%u'需要'unsigned int'類型的參數(假設'print_log'的行爲類似於'printf')。要打印'uint32_t'值,可以使用'print_log(「%lu」,(unsigned long)x);' –

回答

1

double-1.0超出uint32_t的範圍。

將帶符號或無符號整數值轉換爲無符號整數類型具有明確定義的行爲。結果被封裝到目標類型的範圍(減少的模MAX + 1,其中MAX是目標類型的最大值)。

將超出範圍的浮點值轉換爲整數類型具有未定義的行爲。結果因系統而異,並不奇怪。原則上,它甚至可能會導致程序崩潰。

一旦您決定想要輸入-1.0的結果,您可以計算出如何生成沒有未定義行爲的結果。

+0

Thx來回復。在我的程序中,我想計算兩個雙數之間的差異。值應該是積極的,但是,由於另一個bug而變成負值。所以我想知道爲什麼linux-gcc和NDK的價值不同。而現在,我認爲我應該先將這個值轉換爲int32_t,然後將其轉換爲uint32_t。 – homelesser

+0

我建議將差異計算爲「double」,然後測試它是否爲負值。 –