2017-01-04 5 views
2

다음 프로그램에서 모든 플랫폼에서 ~ 및 < < 연산이 음수 값으로 수렴됩니까?반복되는 ~ 및 << 연산이 모든 플랫폼에서 음수 값으로 수렴됩니까?

#include <iostream> 

int main() 
{ 
    int x{}; 
    for(int i{}; i < 32; ++i) { 
     x = ~x; 
     x <<= 1; 
     std::cout << x << '\n'; 
    } 
} 

왼쪽 교대가 구현 정의되지 않았기 때문에 내 평가가됩니다. int이 32 비트보다 큰 경우 수렴하지 않는 유일한 시간이라고 말할 수 있습니까?

+0

'내가 {}'무슨 뜻 int이며? 아니면'int x {}'입니까? 어떤 데이터 형식의 기본값 인 서수의 비어있는 초기화 프로그램 목록, vs'= 0'? –

+4

부호가있는 변수의 왼쪽 시프트는 오버플로되면 정의되지 않습니다. – Barmar

+4

@DavidLively int i {}는 값 초기화를 의미합니다. POD 정수의 경우 이는 0으로 초기화됨을 의미합니다. – wally

답변

0

좌측 시프트가 구현을 정의하지 않았기 때문에 내 평가가됩니다.

위의 진술은 잘못되었습니다. 음의 값의 왼쪽 시프트는 undefined behavior이고 초기 0 값의 비트가 반대로 되 자마자 음수입니다.

#include <iostream> 
#include <limits> 

int main() 
{ 
    unsigned short x{}; 
    for(int i{}; i < CHAR_BIT*sizeof(unsigned short); ++i) { 
     x = ~x; 
     x <<= 1; 
     std::cout << x << '\n'; 
    } 
} 
:


변수는 부호없는 정수 다음은 (비트의 정도가 이동하는 경우)는 모든 호환 플랫폼에서 양의 값으로 수렴 할 말을 공정 할 것입니다 있었다면

는 (2의 보수 시스템) 생산 :

65534 
2 
65530 
10 
65514 
42 
65450 
170 
65194 
682 
64170 
2730 
60074 
10922 
43690 
43690 
+1

하나/일부/대부분의 플랫폼에 대한 테스트는 모든 플랫폼 –

+0

에 대한 증거가 될 수 없습니다. 실제 현대 플랫폼은 대개 고대보다 산술에서 더 일반적입니다. 나는 99 % 오늘날의 아키텍처에 대한 연습 가정에 조건부로 동의 할 수 있습니다.그러나 일반적으로 휴대용이 아닙니다. –

+0

@JacekCz 좋은 지적. 플랫폼이 C++ 표준을 준수하는 경우에만. – wally