2017-01-26 2 views
1

이의 우리는 다음과 같은 루프를 가정 해 봅시다 자체가 종료됩니다. 그러나, 내 질문은 그것이 얼마나 오래 실행됩니까? 내 교수가 int가 4 bytes = 32 bits 일 경우 -2147483648 to 2147483647에서 숫자를 저장할 수 있다고 말했기 때문에. 이것을 감안할 때 그는 for-loop에서이 숫자 중 하나에 도달하고 루프가 계속 진행되도록 프로그래밍하면 (이 경우처럼) 숫자가 양수가되고 조건은 다음과 같이됩니다. 루프를 종료합니다.는 무한 루프 이제까지

제 질문은 정확히 어떻게됩니까? for 루프에서 -2147483648이 +2147483648이되는 이유는 무엇이며 for 루프에서 +2147483648이 -2147483648이되는 이유는 무엇입니까? 왜냐하면 카운터가 2147483649에 도달하자마자 세분화 오류가 발생한다고 생각했기 때문입니다. 응답 해 주셔서 감사합니다.

+3

의심의 여지없이 이것은 for-loop 무한대입니다. ... 의심의 여지없이이 루프는 'i> 2'루프 조건이 결코 참이되지 않기 때문에 한번도 실행되지 않습니다. –

+1

무한 루프는'while (true) {}'이 될 것입니다. 하지만 귀하의 질문처럼 정말 정수 산술에 대한 루프가 아닌 것 같습니다. – MrEricSir

+0

@TimBiegeleisen 나를 확인해 주셔서 감사합니다. 내가 미친 알약을 먹고 있다고 생각 했어. – mascoj

답변

2

왜 -2147483648

당신이 비트 표현에 정수를 작성하는 경우이 분명해진다에 2,147,483,647 회전을한다. 단순화를 위해 char 또는 std :: int8_t와 같은 8 비트 변수를 사용할 수 있습니다. 8 비트 유형은 2^8 = 256 개의 다른 값을 저장할 수 있습니다. 부호있는 변수의 경우이 값은 -128에서 127 사이의 값입니다 (0은 값이기도하므로 최대 127까지). 몇 가지 예 :

0000 0000 = 0 
0000 0001 = 1 
0111 1111 = 127 

1111 1111 = -1 
1111 1110 = -2 
1000 0000 = -128 

쉽게 값이 -1 당신은 예를 들어 계산하면 -1 + 2 = 1

1111 1111 
+ 0000 0010 
    1111 11  (carry)  
    --------- 
    0000 0001 

당신이 값 0111 (1111) 증가하면 1111 (1111) 할 필요가 있음을 알 수 = 127 당신은 1000 0000 = -128을 얻습니다. 당신의 경우에 정확히 무슨 일이 있었는지, 단지 몇 비트 더 있습니다.

환상적인 미스터 폭스가 이미 언급했듯이, 실제로 랩 어라운드 여부는 컴파일러 구현에 달려 있으며 표준에 의해 정의되지 않습니다.

5

제목 질문에 답변하십시오; Will an Infinite Loop ever end by Itself :

호 그러나 루프는 무한하지, 심지어 때문에 루프 조건에 대한의 한 번 실행되지 않습니다 없습니다.

for (int i = 1; i > 2; i--) 

i, 1은 루프 조건 i> 2를 만족시키지 않습니다.

그래도 당신은 i < 2을 의미한다고 말하면 대답은 나도 잘 모릅니다. 정수 오버플로는 C++ (see here)의 정의되지 않은 동작입니다.

대부분의 경우 랩 어라운드가 발생하지만 동작이 정의되어 있지 않으므로 실제로 발생할 내용을 논의하는 데는 실제적인 의미가 없습니다.