2016-11-30 59 views
0

我有一種情況,我需要將十六進制字符串0x8aaaf200轉換爲uint32_t。我首先在本地機器上測試了它(Linux Debian盒)。使用strtol()給出錯誤輸出的十六進制字符串轉換

// str contains "0x8aaaf200" 

uint32_t var = (uint32_t)strtol(str, NULL, 0); 
printf("conversion: %x \n\n", var); // prints 8aaaf200 

我然後跑它在不同的機器(基於Android),但讓我吃驚,輸出出來是7fffffff。我認爲這可能與不同機器上的uint32_t大小有關。

有沒有人有關於如何解決它的建議?我無法更改uin32_t類型的用法,因爲它是其他人編寫的代碼的一部分。

+1

在任何符合C99的編譯器中,uint32_t'總是32位。但是正確的格式說明符是['PRIx32'](http://stackoverflow.com/q/12936798/995714) –

+1

嘗試在轉換後測試'errno'的值,它可能會提供一些線索。 –

+0

@JoëlHechterrno說'Errno:數學結果不能代表' – Jake

回答

2

實際上,您將獲得LONG_MAX(即2147483647或0x7FFFFFFF)作爲返回值,當傳遞給strtol的值大於LONG_MAX時會發生這種情況。您應該使用無符號類型在您的機器上表示該號碼。請使用函數strtoul()代替strtol。

相關問題