2011-01-11 6 views
2

아래의 코드는 문자에서 ASCII 코드를 추출하는 중입니다. 일반 ASCII 영역의 문자를 변환 할 때 예상 한 값을 얻습니다. 확장 된 지역에서 파운드와 유로를 변환하면 문자를 저장하고있는 INT에 1의 패딩로드가 생깁니다.C++에서 ASCII 코드를 볼 때 예기치 않은 결과가 발생했습니다.

예 : 아래의 출력은 다음과 같습니다

45 (예상대로 아스키 E) 가 FFFFFF80 그것은 나에게 문제를 일으키는 아니에요

하지만 난 그냥 궁금 해서요 (예상하지만, 사람과 패딩으로 확장 ASCII €)는 이런 일이 발생하는 이유 . 코드는 다음과 같습니다.

unsigned int asciichar[3]; 
    string cTextToEncode = "E€"; 
    for (unsigned int i = 0; i < cTextToEncode.length(); i++) 
    { 
     asciichar[i] = (unsigned int)cTextToEncode[i]; 
     cout << hex << asciichar[i] << "\n";  
    } 

누구나 설명 할 수 있습니까? 감사합니다.

+0

내가 잘못 생각할 수도 있지만 €은 확장 된 ASCII 문자 인코딩에 있다고 생각하지 않습니다. http://www.asciitable.com/ –

+1

아마 Windows 1252 또는 8 비트 ISO 인코딩 중 하나 일 것입니다. –

+0

ASCII 문자는 '부호없는 정수'가 아닙니다. http : //en.wikipedia.org/wiki/ASCII – Johnsyweb

답변

5

먼저 ASCII와 아무런 관계가없는, ASCII를 만들 때 유로화가 존재하지 않았기 때문에 (확장 또는 기타) ASCII에는 €가 없습니다. 그러나 몇몇 ASCII 친화적 인 8 비트 인코딩은 € 문자를 지원하지만 변환은 소스 코드 편집기에 의해 수행됩니다 (컴파일러는 편집기에서 €를 나타내는 바이트 만 보지만 완전히 다른 것일 수 있습니다) 이스라엘의 컴퓨터).

둘째, (unsigned int) 캐스트는 문자의 ASCII 인코딩을 추출하지 않습니다. 단순히 기본 숫자 char 유형의 값을 부호없는 정수로 변환합니다. 이로 인해 변환 된 값이 음수 일 때 이상한 일이 발생합니다. 컴파일러에서 char이 발생하면 signed char이되어 ASCII 값이 127보다 큰 문자가 음수 인 char 값이됩니다.

먼저 unsigned char으로 변환 한 다음 unsigned int으로 변환해야합니다.

7

구현에 따라 char는 부호가 있거나 부호가 없어도됩니다. 귀하의 경우에는 서명 된 것으로 보이므로 0x80은 128 대신 -128로 해석되므로 정수로 형변환하면 0xffffff80이됩니다.

BTW,이

+0

궁금한 점이 있습니다 만, 0x80이 -128로 해석되는 방식이 가장 중요한 비트와 관련이 있습니까? – BeeBand

+0

예, MSB는 signed char의 부호 비트입니다. – harper

+1

예, Harper가 이미 언급했듯이, 대부분의 컴퓨터에서 부호있는 정수가 작동하는 방식이며, MSB는 부호 비트입니다 (http://en.wikipedia.org/wiki/Twos_complement 참조). – wich

1

서명 된 값을 조심할 때주의해야합니다.

서명 된 char을 signed int로 승격시킬 때 첫 번째 비트 (부호 비트)가 고려됩니다. 이 알고리즘은 대략 다음과 같이됩니다 :

1) 이진, X에서 1X-XX-XX-XX (문자가있는 경우 ->0xFFFFFFYY (16 진수)

- 이진 숫자를) 다음 INT가 될 것입니다 ( 1...1-1X-XX-XX-XX (진)) (24 명)들로 시작

2) 0X-XX-XX-XX (이진수)이면 0...0-0X-XX-XX-XX (이진수) ->0x000000YY (16 진수)이됩니다.

귀하의 경우 규칙 # 2를 항상 강제하고 싶습니다. 이것을하기 위해서 컴파일러에게 첫 번째 비트 (부호 비트)를 무시하도록 지시해야합니다. 이를 위해 unsigned char을 사용해야합니다.

관련 문제