[英]Type-mixed integer division in C: compiler bug or defined behaviour?
在為使用GCC編譯的小型ARM處理器編寫軟件時遇到了一個怪癖。 處理器沒有硬件除法引擎,因此除法是通過軟件實現的。
以下代碼復制了行為,使用volatile語句來避免優化:
volatile int32_t x = -4000;
volatile uint32_t y = 4;
volatile int32_t z = x / y;
uart_printf(DBG_LVL_INFO, "%d / %d = %d\r\n", x, y, z);
為z打印的結果是1073740824
,但我希望結果是-1000
。
類型混合似乎很關鍵。 用int32_t
替換uint32_t
可解決該錯誤。
-1000
錯誤地解釋為無符號整數不會產生結果,有趣的是,結果看起來等於結果加2 30 。
這是錯誤,還是只是定義好的行為?
在C上進行數學運算時, 較窄的類型將轉換為較寬的類型。 在您的情況下,所有int32_t
變量都將轉換為uint32_t
,這是由於升級效果。
-4000
在uint32_t
是一個非常大的數字。 實際上,它是0xFFFFFFFF - 4000
,約為40億。 如果將40億(或其他)除以4,您將得到結果。
通過在各處使用相同類型或在使用變量之前進行強制轉換來解決您的問題:
volatile int32_t z = x / (int32_t)y;
打印結果時,使用int32_t
或uint32_t
%d
是未定義的行為,因為它僅適用於int
類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.