2009-05-08 2 views

답변

3

피연산자가 정수이고 부호없는 값이있는 경우 부호없는 값으로 변환됩니다. 예를 들어

-1 > (unsigned int)1 // as -1 will be converted to 2^nbits-1 

전환 INT-> 부호 INT는 : N> = 0 -> N; n < 0 -> n (mod 2^nbits)입니다. 예를 들어 -1은 2^nbits-1이됩니다.

변환 부호없는 int-> int는 다음과 같습니다. n < = INT_MAX -> n; N> INT_MAX - 대상 유형 부호 경우> 구현

을 정의 결과 값 소스 정수 합동 최소 부호없는 정수 (모듈 2^N 여기서, n은 인 비트 수를 사용 부호없는 유형을 나타내는 ). 대상 유형에 서명하는 경우는, 대상 유형 (비트 필드의 폭)로 표현 될 수 있다면

상기 값은 불변이고; 그렇지 않은 경우 값은 구현에 따라 정의됩니다.

+1

"왜?": 표준은 5 : 9에서 "일반적인 산술 변환"을 다룹니다. 하나의 피연산자 유형에 서명되지 않은 유일한 차이점이 있다면, 약간의 머리 긁기와 함께 목록의 4 번째, 5 번째 및 8 번째 규칙은 함께 말합니다. –

0

컴파일러에 따라 다를 수 있습니다. 질문 "Should I disable the C compiler signed/unsigned mismatch warning?"을 보면 "litb"의 경우 signed-var가 부호없는 값으로 "승격"된 변수를 볼 수 있습니다.

어떤 경우에는 한 변수가 특정 값에 도달하면 (즉, most significant bit이 설정된 경우) 컴파일러가이 상황을 처리하는 "올바른"방법이 없습니다. 그런 경고가있는 경우 반드시 제거하십시오.)

1

나는 C++이/부호 변환을 서명 처리하는 방식의 C에서 벗어나는 생각하지 않는다 :

변환 규칙은 unsigned 피연산자가 관련된 경우 더 복잡합니다. 부호있는 값과 부호없는 값 사이의 비교는 유형의 크기에 따라 에 의존하기 때문에 컴퓨터에 따라 달라 지므로 입니다. 고려 (K & R)

하나의 중요한 요소는 그 정수의 프로모션에 영향을 줄 수 있기 때문에 유형 중 하나가하는 long 정수 여부입니다. 예를 들어, long intunsigned int과 비교하고 long intunsigned int의 모든 값을 나타낼 수 있다면 unsigned intlong int으로 변환됩니다. 그렇지 않으면 둘 다 unsigned long int으로 변환됩니다.

대개의 경우 불일치를 발견하면 컴파일러는 부호있는 정수를 부호없는 정수로 변환해야합니다.