char ch = 255 를 넣으면 왜 1101 0101 이 된다고 생각한 것인가요?
누가 알려줬는지는 모르지만 정말 이해할 수 없는 값이네요..
프로그램에서는 일반적으로 255처럼 10진수를 사용하여 표현하지만
컴퓨터는 내부적으로 모든 표현을 이진수로 하기 때문에 255도 이진수인 1111 1111 로 하여
ch 가 가리키는 메모리에 그대로 매핑을 하죠
int i = 255 ; char ch = 255
i = 0000 0000 1111 1111
ch = 1111 1111
위처럼 저장이 되는 것입니다.
char 형의 변수는 8비트 크기를 가지면서 최상위 비트를 부호 비트로 사용합니다.
즉 s xxx xxxx <- 형식에서 맨 앞의 s에 해당하는 비트가 부호가 됩니다. (1:- , 0:+)
그리고 char ch = 255 를 하면 ch 변수에는 정확히 1 111 1111 의 값이 저장됩니다.
그럼 왜 255(1 111 1111)가 -1 이 되는지 살펴보면
-1 = 0 - 1 입니다.
8비트 메모리 이진 연산을 해 봅시다.
0000 0000 - 0000 0001 을 하면 2진수의 감산 연산은 2의 보수 덧셈으로 표현되죠
0000 0001 의 2의 보수는 1111 1111 이 됩니다.
그럼 0000 0000 + 1111 1111 로 표현되고 결국 답은 1111 1111 이 됩니다.
그러니 1111 1111 은 -1의 값이 되겠죠...
반대로 -1 + 1 = 0 이죠...
8비트 메모리 이진 연산을 해 봅시다.
1111 1111 + 0000 0001 = 0000 0000 = 0
자 위 연산에서 질문이 나옵니다. 1111 1111 + 0000 0001 = 1 0000 0000 이 아닌가요 라고...
맞습니다. 하지만 위에 제가 분명히 명시 했죠 8비트 메모리 연산이라고...
따라서 맨앞의 1은 의미가 없어지죠...
하지만 unsigned char ch = 255 는 결과가 달라집니다. 이때는 최상위 비트가 부호를
표현하지 않고 8비트 모두를 수로 표현 하기 때문에
1111 1111 = 255 가 됩니다.
이정도로 이해가 잘 안돼리라 생각됩니다.
자세한것은 전자계산기 개론 같은 책을 보시면 더 이해하기 쉬울거 같네요...
|