글수 49
이건 뭐 강좌라고 하기도 뭐하고, 그냥 팁도 못 되는 허접하기 그지없는 글입니다.
아무것도 모를 시절, 변수 이야기 나오면 꼭 뒤따라 오는 이야기가 바로 signed/unsigned입니다.
변수가 뭔지도 감이 안 잡힌 상태에서 저런게 나오면 당황스럽기 그지없죠...
그것도 그렇고, 제가 항상 느끼는 거지만
아무것도 모르는 사람은 signed/unsigned의 차이를 마치 16진수와 10진수의 차이처럼 알고 있더란 것입니다.
쉽게 말해, 0x11과 17은 같습니다.
단지 16진수로 적느냐, 10진수로 적느냐 차이일 뿐인 거지요.
그런데 가끔 이 둘을 다른 것으로 오해하시는 분들이 계십니다.
그런 분들은 16진수로 안 적으면 오류라도 나는 줄 아시더군요...
그런 것처럼 signed와 unsigned도 실은 표현 방법의 차이일 뿐이지 같은 겁니다.
char 단위에서 -20이나 236은 같은 것이라고요.
char 변수에 -20, 236, 0xec를 대입하는 것은 모두 똑같은 값을 대입하는 것입니다.
특히 덧셈, 뺄셈 연산은 signed/unsigned를 가리지 않고 똑같습니다. (일단 그런 일치점을 얻도록 signed를 설계하기도 했다지만...)
그런 것은 접어두더라도, unsigned에 대해 처음 접하는 사람에게 어떻게 설명해야 잘 알아들을까 하는 것을 생각해봤습니다. (특히 unsigned이란 개념이 없는, VB 해본 사람이 더 헷갈려 하더군요.)
결론은 unsigned는 단순히 참고 표기(notation)라고 해두는게 낫다 싶다는 것입니다.
예를 들면 그냥 숫자, 좌표 같은건 얼마든지 음수를 가질 수 있습니다.
이런건 그냥 int로 쓰면 됩니다.
하지만 나이, 길이, 개수 같은 것은 음수가 들어가선 안 됩니다.
이런 경우 unsigned를 붙여줘서 '이 변수에는 음수를 넣지 말라' 또는 '이 변수에는 양수만 넣어라'는 표기로 이해하도록 하는 것이지요.
unsigned가 붙어도 어떤 특별한 의미가 있는 것이 아니라, 단순히 '음수를 넣지 말 것'이란 의미로 이해하도록 하면 큰 무리 없이 넘어갈 수 있을 것 같습니다.
덧붙여, 음수를 고려하지 않아도 되다보니 "여유가 생겨서" signed보다는 좀 더 큰 수도 담을 수 있다는 것은 말해줘야겠죠.
(int의 경우 32비트이므로 2^32 가지를 표현할 수 있으므로 수직선에서 2^32만큼 선을 쭉 그어주고, 대신 중심에 0이 오도록 맞춰줍니다. 그러면 그게 int의 표현 범위가 됩니다.
하지만 unsigned int의 경우 음수를 생각하지 않아도 되니까 이 범위를 쭉 옮겨서 왼쪽 끝을 0에 맞춰보는 겁니다. 이런 식으로 설명해주면 자연히 표현 범위가 위쪽으로 늘어난다는 것을 알 수 있을 것 같네요.)
하여간 이 방법의 핵심은 unsigned를 단순히 '음수 불가' 또는 '양수만' 표기로 본다는 거죠.
사실 2의 보수나 변수의 범위 같은건 기초임이 분명하지만, 기초 단계를 벗어나야만 제대로 이해하게 된다는 것도 웃긴 일입니다. ('기초(fundamental)'적인 내용이지만 '기본(basic)'으로 알고 있도록 기대하기도 힘든 것들이죠... 아무리 봐도 처음부터 저런걸 제대로 알고 넘어가는 사람이 보이질 않습니다. 다들 어느 정도 내공이 쌓여야 이해하더군요... -_-)
그럴 바에야 그냥 간단하게 하고 넘어가서 나중에 준비가 되었을 때 자세히 알려준다...는 전략인데.
이런 설명 방법은 어떨까요?
잘 모르는 친구에게 가르쳐주면 잘 이해할 수 있을까요?
(친구께서 숙제 하신다고 XX버에서 소스 코드를 긁어오더니 내용 중 "아직 'int res'를 안 배워서 모르겠다"라고 했을 때 순간적으로 화가 버럭 나더군요. 전에 변수 선언에 대해 열심히 떠들었었는데 -_-)
아무것도 모를 시절, 변수 이야기 나오면 꼭 뒤따라 오는 이야기가 바로 signed/unsigned입니다.
변수가 뭔지도 감이 안 잡힌 상태에서 저런게 나오면 당황스럽기 그지없죠...
그것도 그렇고, 제가 항상 느끼는 거지만
아무것도 모르는 사람은 signed/unsigned의 차이를 마치 16진수와 10진수의 차이처럼 알고 있더란 것입니다.
쉽게 말해, 0x11과 17은 같습니다.
단지 16진수로 적느냐, 10진수로 적느냐 차이일 뿐인 거지요.
그런데 가끔 이 둘을 다른 것으로 오해하시는 분들이 계십니다.
그런 분들은 16진수로 안 적으면 오류라도 나는 줄 아시더군요...
그런 것처럼 signed와 unsigned도 실은 표현 방법의 차이일 뿐이지 같은 겁니다.
char 단위에서 -20이나 236은 같은 것이라고요.
char 변수에 -20, 236, 0xec를 대입하는 것은 모두 똑같은 값을 대입하는 것입니다.
특히 덧셈, 뺄셈 연산은 signed/unsigned를 가리지 않고 똑같습니다. (일단 그런 일치점을 얻도록 signed를 설계하기도 했다지만...)
그런 것은 접어두더라도, unsigned에 대해 처음 접하는 사람에게 어떻게 설명해야 잘 알아들을까 하는 것을 생각해봤습니다. (특히 unsigned이란 개념이 없는, VB 해본 사람이 더 헷갈려 하더군요.)
결론은 unsigned는 단순히 참고 표기(notation)라고 해두는게 낫다 싶다는 것입니다.
예를 들면 그냥 숫자, 좌표 같은건 얼마든지 음수를 가질 수 있습니다.
이런건 그냥 int로 쓰면 됩니다.
하지만 나이, 길이, 개수 같은 것은 음수가 들어가선 안 됩니다.
이런 경우 unsigned를 붙여줘서 '이 변수에는 음수를 넣지 말라' 또는 '이 변수에는 양수만 넣어라'는 표기로 이해하도록 하는 것이지요.
unsigned가 붙어도 어떤 특별한 의미가 있는 것이 아니라, 단순히 '음수를 넣지 말 것'이란 의미로 이해하도록 하면 큰 무리 없이 넘어갈 수 있을 것 같습니다.
덧붙여, 음수를 고려하지 않아도 되다보니 "여유가 생겨서" signed보다는 좀 더 큰 수도 담을 수 있다는 것은 말해줘야겠죠.
(int의 경우 32비트이므로 2^32 가지를 표현할 수 있으므로 수직선에서 2^32만큼 선을 쭉 그어주고, 대신 중심에 0이 오도록 맞춰줍니다. 그러면 그게 int의 표현 범위가 됩니다.
하지만 unsigned int의 경우 음수를 생각하지 않아도 되니까 이 범위를 쭉 옮겨서 왼쪽 끝을 0에 맞춰보는 겁니다. 이런 식으로 설명해주면 자연히 표현 범위가 위쪽으로 늘어난다는 것을 알 수 있을 것 같네요.)
하여간 이 방법의 핵심은 unsigned를 단순히 '음수 불가' 또는 '양수만' 표기로 본다는 거죠.
사실 2의 보수나 변수의 범위 같은건 기초임이 분명하지만, 기초 단계를 벗어나야만 제대로 이해하게 된다는 것도 웃긴 일입니다. ('기초(fundamental)'적인 내용이지만 '기본(basic)'으로 알고 있도록 기대하기도 힘든 것들이죠... 아무리 봐도 처음부터 저런걸 제대로 알고 넘어가는 사람이 보이질 않습니다. 다들 어느 정도 내공이 쌓여야 이해하더군요... -_-)
그럴 바에야 그냥 간단하게 하고 넘어가서 나중에 준비가 되었을 때 자세히 알려준다...는 전략인데.
이런 설명 방법은 어떨까요?
잘 모르는 친구에게 가르쳐주면 잘 이해할 수 있을까요?
(친구께서 숙제 하신다고 XX버에서 소스 코드를 긁어오더니 내용 중 "아직 'int res'를 안 배워서 모르겠다"라고 했을 때 순간적으로 화가 버럭 나더군요. 전에 변수 선언에 대해 열심히 떠들었었는데 -_-)
2007.11.25 05:19:32 (*.234.76.64)
글 쓰는 재주가 없어서 그런지 제가 설명을 잘못했나보네요 ^^;
의도는 signed/unsigned의 개념이 잘 안 박혀있는 사람에게 어떻게 설명해줘야 어느 정도 수긍하고 넘어갈 수 있을까? 하는 방법에 대한 것이었는데... 강좌도 아니지만 팁이라고 보기도 뭐하고, 어차피 설명해주기 위한 내용인지라 결국 이 게시판을 택하게 된 것입니다.
요지는 unsigned를 그냥 in, out 같은 notation으로 보자는 거였지요.
단순히 음수를 넣지 말라는 뜻으로요... 어차피 말씀하신대로 기계가 보기엔 둘의 차이는 없으니까요...
이렇게 설명해주면 정확하진 않아도 잘 모르는 사람은 수긍하고 넘어갈 수 있을 것 같기도 한데 어떨까, 뭐 그런 내용의 글이었습니다. 다른 분들의 의견도 듣고 싶거든요.
의도는 signed/unsigned의 개념이 잘 안 박혀있는 사람에게 어떻게 설명해줘야 어느 정도 수긍하고 넘어갈 수 있을까? 하는 방법에 대한 것이었는데... 강좌도 아니지만 팁이라고 보기도 뭐하고, 어차피 설명해주기 위한 내용인지라 결국 이 게시판을 택하게 된 것입니다.
요지는 unsigned를 그냥 in, out 같은 notation으로 보자는 거였지요.
단순히 음수를 넣지 말라는 뜻으로요... 어차피 말씀하신대로 기계가 보기엔 둘의 차이는 없으니까요...
이렇게 설명해주면 정확하진 않아도 잘 모르는 사람은 수긍하고 넘어갈 수 있을 것 같기도 한데 어떨까, 뭐 그런 내용의 글이었습니다. 다른 분들의 의견도 듣고 싶거든요.

signed/unsigned의 차이는 그저 비트를 값으로 읽을 때의 차이뿐인걸요