프로그래밍 강의/프로그래밍 정보 (9)
○ 10진수 -> N진수 10진법에서 임의의 진법으로 변환할 때에는 정수 부분과 소수 부분을 따로 처리한다. 여기서 정수 부분은 '10진수/N진수'로 몫이 0이 나올 때까지 계속하여 나눠주고 그 과정에서 나머지를 구하면 된다. 소수 부분은 '소수*N진수'로 소수 부분이 없어질 때까지 계속하여 곱해주고 그 과정에서 정수로 올라가는 수를 순서대로 나열하면 된다. 예를 들어 69.6875라는 10진수를 2진수로 변환하여보자. 먼저 정수 부분 69를 몫이 0이 될 때까지 2로 나눈다. 그리고 나온 나머지를 마지막에 나온 나머지부터 취하여 '1000101'이 10진수 69의 2진수 값이 되게 된다. 다음으로 소수 부분 0.6875를 2진수로 변환하기 위해서 2로 계속하여 곱하며, 그 과정에서 정수는 따로 취한다...
○ 2 입력 AND 게이트 XY = F ○ 3 입력 AND 게이트 XYZ = F ○ 2 입력 NAND 게이트 X`Y` + X`Y + XY` = F X`(Y`+Y) + XY` = F X` + XY` = F (X`+X)(X`+Y`) = F X` + Y` = F ○ 3 입력 NAND 게이트 X`Y`Z` + X`Y`Z + X`YZ` + X`YZ + XY`Z` + XY`Z + XYZ` = F X`Y`Z` + X`Y`Z + X`YZ` + X`YZ + XY`Z` + XY`Z + XYZ` + X`YZ` = F X`Y`(Z`+Z) + X`Y(Z`+Z) + XY`(Z`+Z) + YZ`(X+X`) = F X`Y` + X`Y + XY` + YZ` = F X`(Y`+Y) + XY` + YZ` = F X` + XY` + YZ` ..
○ 개념 보수는 뺄셈을 덧셈으로 계산할 때 사용합니다. 예를 들어보자면, 80 - 48이라는 식이 있다고 했을 때, 48의 10의 보수는 52. 80 + 52 = 132이고요, 여기서 삐져나온 자릿수 100을 빼면 32가 됩니다. 어떤가요? 뺄셈을 덧셈해도 뺄셈 계산이 되지요? 컴퓨터 CPU에서는 이러한 방식으로 뺄셈을 2의 보수를 취해서 덧셈으로 계산합니다. ○ 공식 진법은 2진법, 8진법, 10진법, 16진법 등이 있지요? 모든 진법에는 2가지의 보수가 존재하는데, 만약 R진법이라면 R의 보수와 R-1의 보수가 존재합니다. 즉 10진법에는 10의 보수와 9의 보수가 존재하고, 2진법에는 2의 보수와 1의 보수가 존재하겠지요. 이러한 보수를 구하는 공식은 다음과 같습니다. R진법 N자릿수 X의 R의 보..
메모리 누수란 무엇일까요? 보통 우리가 함수에서 선언하여 쓰는 지역변수는 함수가 끝나면 사라지게 되어있습니다. 지역변수가 속한 곳을 스택 공간이라고 부르지요. 우리가 메모리를 제어할 때 사용하는 malloc, new 등은 힙 공간에 자리 잡으면서, 할당을 하면 해제를 시키게끔 프로그래머에게 권하고 있습니다. 이런 해제가 제대로 이뤄지지 않으면 프로그램이 종료되어도 해당 메모리 공간은 계속 차지하게 되고 이것이 쌓이고 쌓여서 메모리 부족현상을 일으킬 수 있습니다. * 비슷한 맥락의 '버퍼 오버플로우' 도 있습니다. 이것은 사용자가 설정한 범위 밖으로 메모리를 침범하는 행위를 일컫습니다. 아무튼, 자신의 프로그램에서 메모리 누수가 발생한 것을 보다 손쉽게 알고 싶다면 여러 가지 방법이 있습니다. 디버거를 하..
전 두 에디안을 16 진수의 입장으로 볼 것입니다. 숫자 1000000 은 헥스 값으로 (0x)F4240 입니다. 먼저 리틀 에디안은 어떻게 저장되는지 살펴봅시다. 리틀 에디안으로 저장했을때, (0x)F4240 은 '4042 0F' 로 저장된 것을 보실 수 있습니다. 즉 헥스 값을 뒤에서부터 두 개씩 잘라서 저장합니다. 다음으로 빅 에디안은 어떻게 저장할까요? 빅 에디안은 (0x)F4240 을 보이는 그대로 저장합니다. 그렇다면 굳이 두 방식을 나눠서 이득을 보는건 무엇일까요? 먼저, 빅 에디안의 장점은 가독성이 높고 대소비교가 빠르다는 것입니다. (즉, 사람이 보기에 좋은 것입니다.) 리틀 에디안의 장점은 산술연산이 빠르다는 것입니다. (즉, 컴퓨터가 보기에 좋은 것입니다.) 둘의 방식은 CPU 와, ..
멀티플레이는 패킷과 패킷과의 통신입니다. 이게 무슨 말이냐면, 실제 상대방 컴퓨터에서 행해지는 모든 행동이 내 컴퓨터로 들어오는 것이 아니라는 말이죠. 그 행동 중에 일부만 캡쳐하여 패킷으로 보내게 하는 것이 멀티플레이 프로그래밍의 역할입니다. 위 사진은 영화 '새벽의 저주' 의 한 장면입니다. 좀비가 지상을 점령하고, 살아남은 옥상에서의 생존자가 맞은편 옥상의 생존자와 체스를 하는 장면인데요. 상대방은 퀸을 B2 구역으로 옮기라고 지시하고 있습니다. 실제 멀티플레이도 이런 하나의 '메시지' 에 의해 이루어집니다. 상대방 체스판을 볼 수는 없지만, 상대방의 메시지는 들을 수가 있는 것이죠. 위 사진에서 Q와 B2는 변수의 전달이라고 볼 수 있습니다만, -> 는 '이동'하라는 명령을 의미합니다. 명령은 패..
자료형에는 일반적인 자료형과 unsigned 자료형이 있습니다. 둘의 차이점은 무엇일까요? 이것은 자료형의 범위에 대해 살펴보면 알 수가 있습니다. short 00000000 00000000 short 는 16비트, 즉 2바이트를 차지합니다. 그렇다면 2^16을 하여 65536의 범위를 가져야 합니다. 그런데 실제로는 -32768~32767 까지의 숫자밖에는 가지지 못합니다. 왜냐하면 일반적인 자료형에는 '음수' 라는 것이 포함되어 있기 때문이죠. (-32768~0~32767) 그렇다면, 어떻게 해야 양수만으로 된 65536 의 범위를 가질 수 있을까요? unsigned short 00000000 00000000 그리하여 만들어진 것이 unsigned 자료형입니다. 'unsigned + 자료형'을 사용한..
구분 컴파일러 인터프리터 번역 단위 전체 행(줄) 목적 프로그램 생성함 생성하지 않음 실행 속도 빠름 느림 번역 속도 느림 빠름 관련 언어 FORTRAN, COBOL, C, ALGOL 등 BASIC, LISP, APL, SNOBOL 등 컴파일러는 문장단위로 목적프로그램으로 번역한 뒤, 링킹 작업을 통해 기계어 프로그램을 만든다. 기계어이기 때문에 속도는 빠른 편이다. 인터프리터는 라인단위로 번역하는 프로그램을 만든다. 프로그램을 실행하면서 직접 번역하므로 속도는 빠르지 않은 편이지만, 링킹 작업을 거치지 않아도 되고 프로그램에 대한 변화에 반응이 빠르다. 어찌 보면 언터프리터는 매력이 없어 보이지만, 프로그램을 기계어로 만들지 않고 한 라인 한 라인을 번역하면서 코드를 실행시킵니다. 이 작업은 번역 도중..
코딩 스타일 코딩 스타일(Coding Style)이란 코드를 작성하는 방식에 대한 개인적인 기호라는 뜻이다. C/C++는 프리 포맷을 지원하며 코드의 형식에 대한 문법적인 제약이 없으므로 마음대로 작성할 수 있다. 개발자는 개성을 가진 인간이기 때문에 누가 작성하는가에 따라 코드의 모양이 조금씩은 달라질 것이다. 코드의 모양이야 어떻든 간에 컴파일러가 코드를 해석하기에 애매하지만 않으면 컴파일하는 데는 아무런 문제가 없다. 그러나 똑같은 내용의 소스라도 사람이 읽기 쉽고 구문 파악이 용이해야 이후 코드를 수정하기 편리하고 효율적으로 유지, 보수할 수 있다. 뿐만 아니라 소스의 구조가 잘 보이면 실수할 가능성이 낮고 골치 아픈 버그의 위험을 조금이라도 줄일 수 있다. 컴파일러는 기계이므로 스타일을 무시하지..