2012-11-29 39 views
1

符號轉換爲以下保證正常工作或實現定義的?無符號在C

unsigned int a = 4294967294; 
signed int b = a; 

b的值是-2上GCC。

從C99 (§6.3.1.3/ 3)否則,新的類型是有符號和值不能在它表示 ;任一結果是實現定義或 實現定義的信號上升。

回答

5

asigned int的轉化是實現定義(如你因爲正確的6.3.1.3p3提到的)。在一些系統上,例如它可以是INT_MAX(飽和轉換)。

對於gcc實施行爲在此定義:

的結果,或由所提出的信號的整數,轉換爲符號整型當該值不能表示在該類型的一個對象(C90 6.2.1.2,C99 6.3.1.3)。

對於轉換的類型的寬度N,值減小模2^N爲內型的範圍;沒有信號提出。

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

+0

如果使用較小的值,其給出了例如一個正整數:'無符號整型一個= 42; signed int b = a;'結果仍然是實現定義的嗎? – user963241

+4

@ user963241在這種情況下'A'的值可以在B'的'的類型來表示,以便轉換後的值是不變的。沒有實現定義的行爲(按照6.3.1.3p1)。 – ouah