2012-01-20 1 views
1

문자 배열이 더 많거나 적습니다. 배열의 각 공간에는 char가 들어 있는데, 필자의 이해에 따르면, 단일 바이트 (8 비트)의 정보입니다. 나는 예를 들면 ... 이진 문자열을 통해 문자 값을 지정 할 수 있어야합니다이진 문자열과 오버플로에서 C++ char 정의

char someChar = char(0b00110011); 

내가 이해할 수없는 것은 왜 지정할 수있는 최대 값이 나는 것을 떠날 필요가 0b0XXXXXXX입니다 MSB 0으로 설정하십시오. 내가 그렇게

char someChar = char(0b11111111); 

같은 문자를 설정하려고하면 나는 진수 값을 얻을 : 매우 오버 플로우처럼 보이는 -2147483648. 그래서 나는 여기서 무슨 일이 일어나는지 정말로 모르겠다. char에 sizeof() 연산자를 호출하면 1 (1 바이트)의 답을 얻을 수 있습니다. char가 서명되지 않은 경우 0-255를 얻거나 char가 서명 된 경우 -128-127을 얻지는 않습니다. 조언/의견을 보내 주시면 감사하겠습니다. 의견의 대부분에 대응

- 나는 그것을 밖으로 인쇄하기 전에 int로 그것을 변환 : 표준 : : cerr < < INT (someChar) 철저한 설명에 대한 모든

감사합니다 :)

+2

"내가 -2147483648을 얻습니다."라고 말하면,'someChar'를 잡고'-2147483648'을 생성하는 실제 코드는 무엇입니까? – NPE

+1

'char' 자체는 _signed_입니다. 이는 MSB가 음수를 표시하는 데 사용됨을 의미합니다. 이렇게 많은 수를 얻으려면 32 비트 int로 변환해야합니다. –

+3

@JoachimPileborg :'char' 자체는 * 또는 * 부호가 붙을 수 있습니다. 그것은 구현에 달렸습니다. (이 점에서 다른 정수 유형과 다릅니다.) – NPE

답변

0

-2147483648은 컴파일러는 대부분의 컴파일러의 경우입니다 signed char,로 해석, 10000000 00000000 00000000 01111111.

입니다. 가장 왼쪽의 비트는 부호 비트로 해석됩니다. int로 변환하면

값의 비트 패턴에 따라서 일곱 우측 비트에 복사되고, 부호 비트는 32 비트 블록의 MSB로 이동된다.

당신은 여기에 두 가지 문제가있다 :

  • 첫째, someChar을 제외하고 서명되지 않은 것으로 보인다. 그렇다면 컴파일러에게 알려 주어야합니다. unsigned char someChar = unsigned char(0b11111111);
  • 두 번째로 콘솔에 넣는 방법은 분명히 int으로 변환해야합니다. 필요하지 않은 경우 someChar을 실제로 인쇄 할 수 있습니다 (예 : signed char).
+2

을 명확히하기 위해 편집했습니다. 32 비트 2의 값으로 -2147483648이 10000000 00000000 00000000 00000000이라고 생각합니다. –

+0

'char'에서'int' 로의 표준 변환은 그렇게하지 않을 것입니다; 확 대 변환은 부호가 있거나 서명되지 않은 모든 값을 보존합니다. –

1

char이 경우 인 에 서명되어 있으므로 최상위 비트를 설정하면 음수 값이 적용됩니다. 양수/음수 값에 대해 걱정하지 않으려면 unsigned char을 사용하십시오.

음수 값은 - 변환하는 방법/표시하는 방법을 보여주세요.


NB. signed char 또는 unsigned char을 사용하여 원하는 것을 컴파일러에 명시 적으로 알릴 수 있습니다. 이진 당신에게 char를 선언 할 때 이진

+0

'char'는 C++ 표준에 따라 서명 될 수도 있고 서명되지 않을 수도 있습니다. 이 경우 Pris의 컴파일러는'char'를 서명으로 처리합니다. –

+0

동의하고, – Useless