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

+ Recent posts