2014-07-11 9 views
-1

... 아래의 코드를 컴파일 할 때 다음과 같은 경고를 얻을부호없는 정수 연산 경고

: 여기

warning: conversion to 'short unsigned int' from 'int' may alter its value 

코드의 발췌 한 것입니다 (몇 가지 예는 내 질문에 설명하기 위해) :

std::vector<unsigned short int> list = {1}; 
unsigned short int one = 1; 

one += list.at(0);       // produces warning 
one += 1;          // produces warning 
one += static_cast<unsigned short int> 1;  // produces warning 
one++;          // does not produce warning 

는 또한뿐만 아니라 이외의 산술 다른 형태의 시도했습니다. 왜 컴파일러는이 경고를 던져서 'int'에서 'unsigned short int'로 변환한다고 주장합니다 (특히 내가 명시 적으로 부호없는 것으로 캐스팅 한 경우)? 두 번째 경우의 'one + = 1;'은 표현식의 오른쪽이 양수이기 때문에 컴파일러는 부호없는 변수 'one'에이를 추가하는 데 아무런 문제가 없을 것입니다.

또한 최종 테스트 'one ++;' 왜 경고하는지 알지 못합니다. 왜 그런지 모르겠습니다.

나는이 질문이 사소하거나 불명확 할 경우 나에게 용서를 구한다. 감사!

+2

g ++에 대한 경고 메시지가 표시되지 않고 어떤 플래그를 사용하고 있습니까? –

+0

경고'C++ -Wall'을 동의하지 마십시오. 아마도 정확한 코드를 붙여 넣을 수 있습니다. – spinkus

+0

경고에 대한 어떤 이유도 보이지 않습니다 (정적 캐스팅 인'1' 주변에 괄호로 오류가 나타납니다) ... [GCC on ideone] (http://ideone.com/CKmX9L)하지만 기본적으로 사용되는 경고 수준은 확실하지 않습니다. 어느 컴파일러를 사용하고 있습니까? 어떤 설정입니까? –

답변

1

C++ 11 §5.17/7


= E2E1 = E1OP 동등 형태 E1연산의 식의 동작이 E1 제외E2는 이고 한 번만 평가 됨

예 : 그것은 한 번만 평가 될 수 one 제외

one = one + list.at(0); 

했다
것처럼
one += list.at(0); 

을 평가한다. C++ 11 §5/9 두 피연산자가 제 int 승격되는 expresseion one + list.at(0)에서는

일반적인 산술 변환 규칙.

요약하면 C++ 2 진 산술 연산자는 int보다 작은 범위의 잠재적 인 유형의 피연산자를 처리하지 않습니다. 피연산자가 승격됩니다. 그리고 최종 할당을 위해 (논리적 인) 변환이 다시 수행됩니다.