계속 죄송합니다. 코드블럭으로 C를 독학하고 있는 잼민입니다.
음수를 만드는 법을 배우는데 비트연산자 중 부정(~)를 앞에 붙이면 음수가 된다고 배웠습니다.
제가 재대로 이해한 것인지 모르겠지만
논리부정이 아니라 비트의 부정이라면 예를 들어
0100.0000 의 비트부정은
1011.1111 이런 식으로 되는걸로 이해했습니다.
그래서 가장 크기가 작은 char를 사용해서(어차피 지난번에 char던 int던 저장은 숫자로 되고 표현만 어떻게 하느냐에 따라 숫자도 되고 문자도 되는걸 확인했습니다.)
char Ch=65;
printf("%d", ~Ch+1);
했습니다. -65가 나오더군요.
그런데 127까지는 -127 나오다가 128로 넘어가니 그냥 128이 됩니다.
게다가 128이 넘어가니 거꾸로 숫자가 줄어들더군요. 음수 부호도 붙지 않고.
저는 unsigned int와 그냥 int의 양수에서의 범위 차이가 2배인 것이 저렇게 음수 때문이라고 생각합니다만.
128이 음수변한 안 되는 것과 +1을 해주는 이유는 잘 모르겠습니다.
"2의 보수"를 공부해 보세요. 컴에서 음수 표현 하는 방식입니다. https://ko.wikipedia.org/wiki/2%EC%9D%98_%EB%B3%B4%EC%88%98
감사합니다. 위키 생각을 못했네요. 다음에는 게시판에 글 올리기전에 먼저 검색해 보겠습니다.
char형의 범위는 -128~127
아, 256/2 해서 +-128이라고 생각했는데, 하나가 작군요....저거 1비트는 아마 부호겠죠?
0도 한자리를 가지고 있어야 합니다.
아하.....0과 NULL은 다르다는 걸...T..T
2의보수가 유리한 이유는 & 연산을 이용한 덧셈 연산으로 간단하게 뺄셈이 가능해 지기 때문입니다.
독학을 해서 그러는지 모르겠지만, 수학을 배워야 하나 생각할 때가 있습니다. 진수계산이야 어려울 게 없지만. 저거하고, 왼쪽 오른쪽으로 진수이동하는 것이 왜 2^n으로 곱하기/나누기와 같은건지 의문을 풀어야 할지. 똑똑한 사람들이 알아서 잘 해놓은거니 그냥 닭치고 외워야 하는건지...
수학 배우셔야 합니다.
char면 용량이 1 byte입니다. 양수 범위로 127까지만 표현 가능합니다. 근데 여기에 128을 넣는 순간 오버플로우가 일어나며 아마 -128이 될 거에요. -128은 8bit로 1000 0000으로 표현됩니다. 이걸 반전 시키면 0111 1111이 되고 여기에 1을 더하면 1000 0000으로 다시 -128이 나올 것 같지만 128이 나오는 이유는 ~C에 1을 더할 때 ~C는 char형이고 1은 int형이므로 ~C가 char형에서 int형으로 타입이 형변환 되고 덧셈이 일어나기에 128로 계산되는 것으로 보입니다.
연산 과정은 아래와 같습니다. char Ch = 128을 하면 메모리에 1000 0000이 저장됩니다. ~Ch 연산으로 0111 1111이 됩니다. ~Ch가 char(8bit)에서 int(32bit)로 변환됩니다 메모리 상에서는 아래와 같이 표현됩니다. 00000000 00000000 00000000 01111111 이제 여기에 int형 1을 더합니다. 그러면 메모리 상에서는 아래와 같이 표현됩니다. 00000000 00000000 00000000 10000000 이 32bit는 10진수로 128로 해석됩니다.
아. 이렇게 풀어쓰니 확, 보이네요. 감사합니다. 이렇게 늦은 시간에 유게나 성유게도 아니고 프로그레밍 게시판에 답변을 받을거라고는T..T