簡體   English   中英

一元減號和浮點數轉換的組合

[英]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.

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