[英]combination of unary minus and float conversion
考慮以下C語句:
unsigned long x = 1;
float a = -x;
double b = -x;
我希望一元減項產生一個等於ULONG_MAX的無符號長值,而a和b分別設置為ULONG_MAX的單精度和雙精度表示。
這是我在32位Linux上使用gcc 4.4.7以及在64位Linux上使用Intel和PGI編譯器獲得的結果。 但是,對於64位Linux上的gcc(測試版本4.4.7,4.7.2和4.8.0,都帶有-O0和-O2),雙變量b具有預期值,但float a等於-1代替。
相比之下,以下語句將在我測試的所有編譯器和系統上將a和b設置為ULONG_MAX的浮點表示:
unsigned long x = 1;
unsigned long y = -x;
float a = y;
double b = y;
如果我使用unsigned int而不是unsigned long,我也會在所有系統上得到預期的結果。
這是某種未定義的行為還是編譯器錯誤?
這是由於GCC中的一個錯誤 - 類型轉換發生在否定之前。
這個問題似乎已經存在了一段時間。 錯誤55771 - 錯誤交換了否定和類型轉換
在第二個示例中,否定發生在類型轉換之前。 因此,您會看到預期的結果。
你描述的是編譯器錯誤。
(以下程序中沒有未定義的行為來原諒編譯器)
unsigned long x = 1;
float a = -x;
double b = -x;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.