簡體   English   中英

C中的類型混合整數除法:編譯器錯誤或定義的行為?

[英]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 ,這是由於升級效果。

-4000uint32_t是一個非常大的數字。 實際上,它是0xFFFFFFFF - 4000 ,約為40億。 如果將40億(或其他)除以4,您將得到結果。

通過在各處使用相同類型或在使用變量之前進行強制轉換來解決您的問題:

volatile int32_t z = x / (int32_t)y;

打印結果時,使用int32_tuint32_t %d是未定義的行為,因為它僅適用於int類型。

暫無
暫無

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

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