가끔, 사용자함수든 API든 인자에 음수를 사용할 때가 있습니다. 그런데, 창조에선 음수에 좀 버그가 있는 것 같네요...
심한 경우에는, 함수 실행이 되지 않고 그 자리에서 실행이 끝나는 심각한 버그가 있습니다 -_- 심지어 음수는 값도 반환하지 않고 끝납니다.
이런 증상을 어찌해야 할까요? 네, 음수를 쓰지 않는 것입니다 -_- 자신이 만든 함수에서 가능한 음수를 쓰지 않으면 됩니다.
문제는, API 같은 거죠. 이런 놈들은 가끔 음수를 요구하는데, 음수를 받아들이지 못하니 문제가 됩니다 -_-
그러나 방법은 있습니다. 음수를 양수로 바꿔수면 됩니다. 이게 무슨 소리냐? 하실 지 모르겠는데, 컴퓨터에서 같은 메모리를 가지고 수를 표현 할 때, 음수/양수형으로 나타낼 수 있습니다.
음수형은 음수까지 표현할 수 있지만, 그 만큼 큰 값을 표시할 수 없습니다. 양수형은 큰 값을 표시할 수 있지만, 음수를 표현할 수 없습니다.
2바이트의 메모리를 가지고 있다면, 양수형은 0~65535 까지 나타낼 수 있지만, 음수형은 -32768 ~ 32767 까지 표현할 수 있습니다. 보시는대로 음수형을 사용하면 좀 더 큰 수를 표현하기 곤란해집니다. (물론 둘 다 같은 크기의 메모리를 사용하면)
그건 그렇고, 결과적으로 음수형과 양수형은 인식하기 나름일 뿐 메모리는 같다는 겁니다. 1 바이트의 메모리에서, 16진수로 A3 라는 데이터가 있다면...
양수형일 때는 163 이라는 값으로 해석합니다. 음수형일 때는 -93 이라는 값으로 해석합니다.
뭐가 다를까요? -.- 일반적으로 양수형을 음수형으로 바꿀 때는 2의 보수법이라는 방법을 사용합니다.
한번 양수 163 이란 값(16진수로 A3)을 음수로 해석하면 어떻게 나오는지 볼까요?
별 거 없습니다! 원리는 집어 치우고, 방법을 소개해보죠. 1. 양수형에서 1을 뺍니다. (163 - 1 = 162) 2. 비트 반전을 합니다. (162는 2진수로 10100010, 반전하면 01011101) 3. 그럼 끝입니다 -_- (01011101 은 16진수로 5D, 10진수로 93)
93이 나오네요. 음수형이기 때문에 앞에 - 가 있다고 생각해야죠. 그러니까, 163 이란 값은 음수형으로 해석하면 -93 이 됩니다.
감이 오시나요? 음수가 안된다면, 같은 값의 양수로 넣으면 됩니다! 해석하기에 따라 값이 다르지만, 메모리에 저장된 내용은 같은 것이니까요...
-38 을 양수형으로 바꾸려면 어떻게 해야 할까요? 반대로 하면 됩니다. 한번 해볼까요?
1. 음수 기호를 떼버립니다. (-38 => 38) 2. 비트 반전 합니다. (38은 이진수로 00100110, 반전하면 11011001) 3. 이번에는 1을 더합니다. (11011001은 16진수로 D9, 10진수로 217... 1 더하면 218)
답이 나왔습니다. 음수 표현 -38 은 양수 표현 218 과 같습니다. 그러니까, 이 두 값은 메모리에 똑같이 올라가지만, 해석하는 방법에 따라 -38 이 되기도 하고 218 이 되기도 한다는 겁니다.
우리가 양수로 218 을 보내주면, 해석하는 쪽에선 이 것을 음수로 여겨 -38 로 해석한다는 뜻이죠. 다시 말해, 우리가 어떤 형태로 보내든 해석하는 쪽(DLL 함수)은 무조건 음수로 해석 시도합니다.
그러니까, 음수를 인자로 넣을 때는 이런 식으로 변환을 해줘야 합니다.
참고로, 창조의 실수는 4 바이트 = 32 비트 이기 때문에 좀 다릅니다. -38 을 창조식으로 고치면 4294967258 이 나옵니다 -_-
암산은 조금 힘들겠죠? 아무래도 프로그램을 하나 만들어야 할 것 같네요~ |
|