yes 일까, no 일까..
문자열 공부 중 책에 아래와 같은 코드가 있었다.
char* str1 = "you";
char* str2 = "me";
if(strlen(str2) - strlen(str1) >= 0 ) printf("yes\n");
else printf("no\n");
strlen(const char* string) 함수는 문자열의 길이를 반환한다.
strlen(str1) - strlen(str2)은 2-3 이므로 -1. 여기까지는 문제없다. 하지만 반환하는 데이터 타입이 unsigned 이다.
그래서 저 코드의 출력은 yes 이다.
부호가 없는 unsigned 끼리의 뺄셈에서 결과값도 음수가 아닌 양수로 나온다... unsigned 는 부호비트가 없으니 무조건 양수로 나와야겠지.. 그럼 어떻게? 이 계산은 모듈라 연산을 따른다.
stackoverflow 사이트에서 같은 내용이 있다. 아래 그림도 해당 사이트에서 가져왔다.

9시에서 4시간을 더하면 1시, 1시에서 4시간은 빼면 -3시가 아니라 9시다.
즉 9 + 4 = 1 (13 % 12), 1 - 4 = 9 (-3 % 12)이다.
이 방법을 저 코드에 대입하면 다음과 같다. (2 - 3) % 2^32, 그리고 결괏값은 4,294,967,295이다.
앞에 3byte는 빼고 1바이트만 놓고 보자.
2 -> 0000 0000 0000 0000 0000 0000 0000 0010, 1을 빼면
1 -> 0000 0000 0000 0000 0000 0000 0000 0001, 1을 다시 빼면
0 -> 0000 0000 0000 0000 0000 0000 0000 0000, 1을 다시 또 빼면
-1 -> FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 가 된다.
결괏값이 unsigned 이거나 unsigned 값끼리의 연산, 혹은 strlen과 같은 함수를 사용할 때는 부등식, 조건식에서 주의를 기울이며 사용해야겠다.
'C' 카테고리의 다른 글
매개변수에 전역변수 (0) | 2022.05.13 |
---|---|
LinkedList (0) | 2022.05.10 |
shallow & deep copy (1) | 2022.04.27 |
main(int argc, char** argv) (0) | 2022.04.26 |
문자열 (2) | 2022.04.21 |