2014-11-24 7 views
0
#include <stdio.h> 

main(){ 
    printf("Give a number in decimal form\n"); 
    int Division,a=1,sum=0,Bit,Digit; 
    scanf("%d",&Division); 
    do{ 
     Digit= Division%2; 
     if (Digit==1){ 
      sum++; 
     } 
     Division/=2; 
     Bit += Digit*a; 
     a*=10; 
    }while(Division>0); 
    printf("%d is the number in binary form\n",Bit); 
    printf("The number of 1s in the binary form is %d",sum); 
} 

연습의 목적은 10 진수를 이진 형식으로 변환하고 1을 계산하는 것입니다. 그것은 1023까지 잘 작동하지만 1024에서는 10 진수를 포함하는 "2 진"숫자를 인쇄합니다. 1 카운트가 올바르게 작동합니다. 범위와 관련하여 문제가 있습니까?C에서 이진수로 이진수로 오류가 발생했습니다.

+4

예, 아마 'int Bit;'가 넘칠 것입니다. '길다'로 설정하면 시간을 절약 할 수 있지만 문자열로 조합하는 것이 좋습니다. 나는 그것이 C에서했던 것보다 쉽다는 것을 깨닫는다. 큰 버퍼를 할당하십시오 - 33 문자 (= 32 비트 + 1은 nul) - 그리고 그것을 뒤쪽으로 쓰고 33을 오버플로하지 않았는지 확인하십시오. – Rup

+3

** 당신의 코드를 ** 디버그 **하고 변수의 중간 값을 검사한다면 그런 다음 정수 오버플로가 있음을 신속하게 인식해야합니다. –

+2

시작하기 전에 비트를 0으로 초기화해야합니다. –

답변

1

1024의 마지막 (최상위) 비트가되면 a의 값은 10000000000 (10^10)입니다. 그것을 제외하고. int은 32 비트 정수이므로 a의 값이 오버플로 (두 번)되고 1410065408이됩니다.