Rev. 2.73

자바스크립트에서 버퍼를 읽거나 쓰는 예문들을 볼때 C에서 사용되는 'signed'와 'unsigned'라는 키워드에 비유하는 내용을 자주 접하게 됩니다. 이게 무엇이고 왜 구분을 해야 하는 것인지를 몰라서 우리 팀장님께 커피 한 잔 사드리고 특강을 받았습니다. 제가 이해하기 쉽게 '음수를 표현하느냐 안 하느냐의 차이'라고 알려 주셨고, 메모리에 비트를 기록하는 방식이 다르다고 했습니다. "더 자세히 설명해 주세요~"했더니 CPU가 어쩌니 어셈블리가 저쩌니 한 귀로 듣고 흘려 버릴수 밖에 없는 내용이어서... 나중을 대비해 나름 이해한 내용을 정리합니다.

예를 들어 C언어에서는 다음과 같이 8비트 정수 타입을 선언할 수 있습니다.

signed char
unsigned char

unsigned char는 비트를 투명하게 볼 수 있는 특성이 있으며, 임의의 메모리에 바이트 단위로 접근해서 값을 다룰 수 있습디다. 이 경우에는 unsigned char를 사용하는 것이 강제됩니다. 그리고 signed char는 unsigned char와 값이 같아도 같지 않은 경우가 발생할 수도 있습니다. 왜냐하면 signed는 음수 표현을 위해 2의 보수 체계를 사용하고 부호 비트(MSB)가 필요하기 때문입니다.(0 이면 양수 1 이면 음수) 그래서 부호 비트가 없는 unsigned는 양수 범위를 두 배로 늘리는 역활을 한답디다. 즉, char 형식은 8비트이므로 signed char은 -128~127의 범위를 표현할 수 있고 unsigned chare은 0~255의 표현범위를 가지는 것입니다.

조금더 이해하기 쉽게 그림으로 예를 들어봅시다. 정수 3인 1바이트(8비트)를 2진수로 기록하면 00000011이 됩니다. Unsigned에서는 다음과 같이 부호가 할당되겠죠.

0 0 0 0 0 0 1 1

Signed는 음수를 표현하기 위해 제일 앞 하나의 비트를 소비한다고 했습니다. 그럼 정수 3은 이렇게 되겠군요.

0 0 0 0 0 0 1 1

온라인 이진수-정수 변환기를 사용해 보면 금방 이해할 수 있습니다.

(나도 언젠가는 CPU의 마음과 메모리의 정신을 이해할 수 있겠...)

Comments

Got something to add? You can just leave a comment.

  • BeyondItBlog BeyondItBlog

    Singed와 Unsinged 차이: 자바스크립트에서 버퍼를 읽거나 쓰는 예문들을 볼때 'signed'와 'unsigned'라는 키워드에 비유하는 내용을 자주 접하게 됩니다. 근데, 이걸 왜 구분... firejune.com/1791

    from twitterfeed

  • 기록이 좀 잘못된 부분이 있습니다. ^^

    마지막 부분에서 예를 들때, "정수 3인 1바이트(8비트)를 2의 보수로 기록하면 00000011이 됩니다." 라고 하셨는데요.

    양수는 컴퓨터에서 그냥 2진수로 표현합니다. 단지, 음수에 대해서만 2의 보수로 기록하는 것입니다.

    따라서,

    정수 3은 2진수로 0000 0011 로 표현.
    정수 -3은 2의 보수로 1111 1101 로 표현.

    한다는 것이 맞습니다.

    reply edit

  • 2의 보수란 뜻을 이해하지 못해서 발생한 오류였군요. 덕분에 제대로 공부했습니다. 감사합니다.

    reply edit

  • 자바스크립트를 공부해 보려고 하고 있었는데 파이어준시 블로그가 많은 도움이 되네요^^ 잘보고 갑니다~~

    reply edit

  • 도움이 되셨다니 다행이에요.

    reply edit

Your Reaction Time!

captcha

avatar