2017-03-16 5 views
1

그래서이 코드64 비트로 10 진수를 2 진수로 변환하는 방법은 무엇입니까?

int main() 
{ 
    int n, c, k; 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

    printf("%d in binary is:\n", n); 

    for (c = 31; c >= 0; c--) 
    { 
    k = n >> c; 

    if (k & 1) 
     printf("1"); 
    else 
     printf("0"); 
    } 

    printf("\n"); 

    return 0; 

} 

그것은 바이너리 만 32 비트로 진수로 변환에게 있습니다. 64 비트로 변경하면 작동하지 않습니다 (32 비트 결과를 두 배로 늘리는 것처럼 보입니다). 동시에 8 또는 4 비트 등으로 잘 작동합니다. 내가 뭘 잘못하고 있니?

+1

어떻게 64 비트로 변환하는? 'c = 63'? – AntonH

+1

@AntonH : int가 64 비트가 아니라면, 정의되지 않은 동작을 발생시킵니다. – Olaf

+1

은 ''및 고정 크기 유형을 사용합니다. –

답변

2

10 진수를 2 진수로 변환하지만 32 비트 만 변환합니다. 64 비트로 변경하면 작동하지 않습니다 (32 비트 결과를 두 배로 늘리는 것처럼 보입니다).

문제가 있습니다.

int n, c, k; 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

n 16 비트만큼 작을 수있는 int이다. 64 비트 일 수도 있지만 32 비트 일 것입니다. 64 비트 숫자를 입력하려고하면 쓰레기가 생깁니다.

#include <stdio.h> 

int main() { 
    int n; 

    printf("sizeof(int) == %zu\n", sizeof(int)); 

    printf("Enter an integer\n"); 
    scanf("%d", &n); 

    printf("n = %d\n", n); 
} 

$ ./test 
sizeof(int) == 4 
Enter an integer 
12345678901 
n = -539222987 

대신 64 비트 또는 정확히 64 비트 stdint.h에서 int64_t의 최소 크기를 가진 long long int을 사용할 수 있습니다. 독자에게 더 명확하게하기 위해 특정 너비가 필요한 코드에서 명시적인 너비 형식을 사용하는 것이 좋습니다. int64_tmacros from inttypes.h을 사용하는 반면

long long intscanf에 대한 %lldprintf를 사용합니다. 아래 코드는 C가 자동으로 상수 문자열을 연결하는 것을 이용합니다. "foo" "bar""foobar"은 동일합니다.

#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

int main() { 
    int64_t n; 

    printf("Enter an integer\n"); 

    scanf("%"SCNd64, &n); 

    printf("n = %"PRId64"\n", n); 
} 


$ ./test 
Enter an integer 
12345678901 
n = 12345678901 
+1

'% lld'은 (는) 고정 폭 유형에 대해 올바른 변환 유형 지정자가 반드시 필요하지는 않습니다. 'inttypes.h'의 매크로를 사용하십시오. Btw. 몇몇 구현체는 고정 폭 타입 - 이름 ('stdint.h' 그냥'typedefs'라는 내장 이름의 표준 이름)을위한 내장 타입을 가지고있어서 표준 타입과 분명히 구별됩니다. – Olaf

+0

@Olaf 감사합니다! 나는 그것을 고쳐 줄 것이다. – Schwern

0

문제는 n &k 변수의 데이터 형식입니다. 그들은 정수입니다. sizeof (int)를 사용하여 플랫폼의 데이터 유형 크기를 확인하십시오.

64 비트로 변경하면이 변수에 64 비트 값을 저장할 수 없습니다.

HTH!

0

다음 코드는 문제를 처리하는 방법 중 하나입니다 :

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    long long unsigned int n; 
    long long   int c; 
    long long unsigned int k; 

    printf("Enter an integer\n"); 
    if(1 != scanf("%llu", &n)) 
    { 
     perror("scanf for 64 bit number failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, scanf successful 

    printf("%llu in binary is:\n", n); 

    for (c = 63; c >= 0; c--) 
    { 
     k = n >> c; 

     if (k & 1) 
      putc('1', stdout); 
     else 
      putc('0', stdout); 
    } 

    printf("\n"); 

    return 0; 
} // end function: main 

은 여기에 프로그램의 일반적인 실행의 출력입니다 :

Enter an integer 
6789097860397846 
6789097860397846 in binary is: 
0000000000011000000111101010011000000110010100000111101100010110 
+0

참고 : 위의 우분투 리눅스 16.04에서 gcc를 컴파일하고 링크하는 데 사용했다. – user3629249