2016-09-10 3 views
1

10 진수를 2 진수 (16 비트 이하)로 변환하려고합니다. 내 함수는 8 비트까지 완벽하게 작동하지만 숫자를 16 비트까지 인쇄하려고 할 때 문자 인쇄가 중단됩니다. "int"를 8 비트의 데이터 형식으로 사용했지만 16 비트를 저장하려고하므로 모든 변수에 부호없는 long int를 사용하고 있습니다. 왜 이런 일이10 진수에서 2 진수로 변환 (16 비트)

0000 
Process returned 0 (0x0) execution time : 0.063 s 
Press any key to continue. 

누구나 알고

/* Program to convert decimal to binary (16 bits) */ 

#include <stdio.h> 
#include <string.h> 

char *byte_to_binary_str(long unsigned int byte); 

int main() 
{ 

printf("%s",byte_to_binary_str(32768)); //1000000 0000000 
    return 0; 
} 

char *byte_to_binary_str(long unsigned int byte) 
{ 
    static char bit_string[17]; 
    bit_string[0] = '\0'; 

    long unsigned int mask; 
    for (mask = 2^15; mask > 0; mask >>= 1) { 
     /* Check if the mask bit is set */ 
     strcat(bit_string, byte & mask ? "1" : "0"); 
    } 

    return bit_string; 
} 

내 출력이 날 수 있습니다 : 여기

코드인가? 미리 감사드립니다. 당신이 2^15을 기대하고 무엇을 mask의 값을 설정하지 않습니다

+0

C'unsigned int'는 적어도 16 비트 폭으로 보장됩니다. 'uint16_t'와 같은 명시 적 - 너비 유형 중 하나를 고려할 수도 있습니다. –

+9

'2^15'은 당신이 생각하는 것을 의미하지 않습니다. [이 도표 참조] (http://en.cppreference.com/w/c/language/operator_arithmetic) * 실제로 * 무엇을하는지. – WhozCraig

+0

그건 내 문제 였어. 나는 항상 그것을 잊어 버린다. 나는 pow (2,15)를 사용하고있다. 지금은 고맙다. – tadm123

답변

4
mask = 2^15; 

그것은 215의 비트 XOR 인 전원 (15)에 제기에는이 없습니다.

1000 0000 0000 0000이 필요합니다. 그 수는 헥사로 0x8000이 될 것입니다. 그러므로 다음을 사용하십시오 :

mask = 0x8000; 

알고리즘에서 의미있는 것을 사용할 수도 있습니다.

mask = 1u << 15; 
+1

OP의 시스템이 16 비트 'int/unsigned'일 수 있으므로'1u << 15'을 사용하는 것이 더 좋습니다. – chux

+0

@chux, 좋은 지적. 감사. –

관련 문제