2012-11-29 2 views
1

다음은 작동 또는 구현이 보장되는지 여부입니다.C에서 서명되지 않은 서명 된 변환

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

b 값은 GCC에 -2이다. C99 가입일

(§6.3.1.3/3) 그렇지 않으면, 새로운 타입의 서명되고, 값이 표현 수 없다; 결과가 구현에 의해 정의되거나 구현 정의 된 신호가 발생합니다. (당신이 제대로 때문에 6.3.1.3p3의 언급 한 바와 같이)

답변

5

signed int-a 값의 변환은 구현 정의이다. 예를 들어 일부 시스템에서는 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

I는 예를 들어 양의 정수 값을 제공하는 작은 사용할 경우'부호의 INT A = 42; signed int b = a; 결과가 여전히 구현 정의입니까? – user963241

+4

@ user963241 그 경우'a'의 값은'b'의 타입으로 표현 될 수 있으므로 변환 후의 값은 변하지 않습니다. 구현 정의 동작은 없습니다 (6.3.1.3p1 참조). – ouah

관련 문제