이를 찾아보게 된 이유
문자열을 이용한 백준 문제를 풀다가 314가 출력되어야 하는데
갤럭시s14가 출력되어 대체 왜 그러나 싶어 봤더니
문자열의 어느 칸에 '0'을 집어넣어야 하는데 집어넣지 않고 뛰어넘어
결과값이 '3'인 51이 아닌 -141이 나와서 s가 출력되었다.
그런데 나는 지금까지 음수처리법을
부호를 나타내는 비트 1개를 제외한 나머지는 양수 141과 같은줄 알았는데
-141에 아스키 코드 115인 s가 출력되어 이가 아님을 알고 왜 그런지 찾아보았다.
원리
그 원리는 일단 INT_MAX에 +1을 하면 -(INT_MAX + 1)가 출력되는 것에서 찾을 수 있는데
01111......1111 이 1이 더해져 10000....0000이 되었는데 -(INT_MAX + 1) 이 된 것이다.
또 여기서 + INT_MAX를 한 11111....1111은 -1인데
이렇게 된 이유는 0,1 부호처리를 제외하고는 대소비교를 일관되게 하기 위해서로 보인다.
그럼 1111.....1111 에서 -140을 하고 비트 8개를 보면 왜 s가 출력된지를 알 수 있는데
비트 8개는 11111111 즉, 255이고 255 - 140은 115이다.
따라서 아스키 코드 115인 s가 출력되는 것이다.