2013-10-14 2 views
1

저는 C++에서 char와 int 사이의 변환을 원하지만 int 변환에 char 문제가 있습니다.잘못된 결과와 함께 char와 int 사이의 C++ 변환

103과 155 두 개의 숫자로 테스트를했습니다. 103 "char"로 "g"를 입력하고 155로 "φ"를 입력하고 둘 다 맞지만 문제는 문자를 int로 되돌려 놓으려고 할 때입니다. " g "나에게 103 (정확한)을 줘라. 그러나 나는 왜"ø "가 나에게 -101을 주는지 모른다.

숫자를 저장하기 위해 char 변수를 사용하고 있으며 "prinf ("% d ", char [x]);" 번호를 다시 보여줘. 내가 기본 256 문자에 번호를 변환 할이 스크립트

5 = 155 = ø = ø = -101 
4 = 103 = g = g = 103 
3 = 0 = = = 0 
2 = 0 = = = 0 
1 = 0 = = = 0 
0 = 0 = = = 0 
1: = 0 
2: = 0 
3: = 0 
4: = 0 
5: g = 103 
6: ø = -101 

:

#include <cstdlib> 
#include <cstdio> 

using namespace std; 

int numero = 26523;  

char *inttochar(int number) { 
    char *salida; 
    for (int j=0;j<=5;j++) { 
     salida[5-j] = number % 256; 
     printf("%d = %d = %c = %c = %d\n", 5-j, number % 256, number % 256, salida[5-j], salida[5-j]); 
     number = number/256; 
    } 
    return salida; 
} 

int main(int argc, char** argv) { 
    char *texto = inttochar(numero); 

    for (int j=0;j<=5;j++) { 
     printf("%d: ", j+1); 
     printf("%c = %d\n", texto[j], texto[j]); 
    } 

    return 0; 
} 

그리고 결과입니다

나는이 테스트 스크립트를했습니다. ¿ 내가 뭘 잘못하고 있니?.

감사합니다. 영어로 유감입니다.

+0

'char'가 서명 된 유형인지 서명되지 않은 유형인지는 구현이 정의됩니다. 귀하의 플랫폼에 서명되어 있습니다. – jrok

+0

또한'char * salida;'는 와일드 포인터이므로 꽤 많은 일이 발생할 수 있습니다 ... –

+0

왜 네임 스페이스가'네임 스페이스 표준을 사용하고 있습니까? '? 나는 실제로 여기에'C++ '코드를 보지 못했다. – crashmstr

답변

2

문자는 -128에서 127 사이의 값으로 서명됩니다 (대부분의 시스템에서). 당신은 그 범위 밖에서 무언가를 변환하고 있습니다. char으로의 변환은 잘리지 만 비트 패턴은 정상입니다. 다른 방향으로 변환하면 범위로 되돌아 가고 155는 그 부분이 아닙니다. 155의 비트 패턴은 0x9b입니다. 부호있는 값으로 변환하려면 비트를 반전하여 하나를 더한다. 그래서 -0x65가된다. 이것은 십진수로 -101이다.

으로 고정 부호 비트를 제거 할 수 있습니다 (salida[5-j] & 0xff).

편집 : 의견에서 언급 한대로 salida 변수는 문자열로 사용되지만 변수를 저장하지 않습니다.

char *salida = new char[6]; 
+0

먼저 'salida'에 유효한 메모리를 할당하는 것이 도움이 될 수 있습니다. –

+0

@ Paulul 좋은 점, 나는 그것을 알아 채지 못했습니다. 하지만 당신이 틀린 사람에게 말하고있는 것 같아요. –

+0

당신이 이미 주요 지점을 다루었 기 때문에 답에 이것을 더하고 싶다고 생각했습니다. –

0

char은 플랫폼에 서명 된 유형으로 표시됩니다. 즉, 155은 적합하지 않습니다. 155-101과 같은 2의 보수 기호로 해석됩니다.