혹시 안 보이나??
// a : 0101 (2진법 표기. 2^0 + 2^2 = 5)
// b : 1010 (2진법 표기. 2^1 + 2^3 = 10??)
// 처음에 a가 5였으니 5+1을 더하고, 부호 비트(32비트 중 맨 앞의 비트)를 반전해서 -(5+1) = -6이 됨.
// 내가 궁금한 건, 그럼 0101이 1010처럼 바뀌는데 왜 10이 아니라 단순히 5에 1을 더하는 거임?? 2진법이 아닌거임??
// 두 번째 궁금한 건, b가 -6이면 ~b = - (-6+1) = 5가 됨. (실행하면 이렇게 나옴)
// 부호 비트는 맨 앞에 있을 테니까, b = - (6) 이런식이란 말이지? 32바이트 중 맨 앞 부분이 부호를 나타내고 뒤에서 네 자리가(int형 변수) 수를 나타내잖아.
// 근데 어째서 (-6+1)을 한 뒤, 부호 비트를 반전시켜 값이 정수가 나오게 하는 거야?
// 나는 - - (6+1) 처럼 돼야 한다고 생각했어. 첫 번째 마이너스는 반전할 때 부호가 바뀌는 거고, 두 번째 마이너스는 원래 -6이었으니까.
// 그래서 결국 계산하면 +7이 나와야 한다고 생각했는데, 이게 왜 아닌지 궁금해.
이렇게 써놓은 부분이 궁금한 부분임 ㅇㅇ..
부호 비트는 1을 더하고 빼는 개념이 아님
a는 0101이 아니라 00000000 00000000 00000000 00000101 임 - dc Cpp
b는 비트반전시키면 11111111 11111111 11111111 11111010이겠지 - dc Cpp
b를 다시 반전시키면 a와 같아지는거고 - dc Cpp
근데 출력은 5나 -6으로 되니깡... 그 32자리 비트수도 잘 이해가 안 돼 32자리면 당연히 10진수로 출력했을 때 값도 높아져야 하는뒈..
물론 int는 환경에 따라서 4바이트가 아닐 수 있음 - dc Cpp
가장 첫자리 비트가 1인 경우 음수인데, 이는 2의 보수로 표현되니까 2의 보수에 대해 검색해보길 바라 - dc Cpp
11111111 ... 11111111은 2의 보수 표현으로 -1임. - dc Cpp
여기서 1을 빼면 ...11111110, 얘는 -2를 뜻하겠지? - dc Cpp
반전시키면 00000000 ... 00000001, 1임 - dc Cpp
그리고, 네가 말한대로 그런 문제가 있음. 01111111 ... 11111111에 1을 더하면 10000000 ... 00000000이 되잖아? 양수중에 가장 큰 수였다가, 음수중 가장 작은수로 바뀌게됨. 오버플로우 개념이지 - dc Cpp
#include "limit.h" 하고, INT_MAX가 몇인지 %d로 출력해보고, 거기에 1 더한다음 출력해봐 - dc Cpp
그렇군요.. 보수는 뭔지 모르겠으나 오버플로우는 알고 있었어요. 보수를 공부하고 오겠습니다
검색키워드는 1의보수, 2의보수 - dc Cpp
참고할게요~
2의보수로 빼는건가