다중 포인터란 2차원 이상의 포인터 변수를 의미합니다. 포인터 변수도 메모리위에 올라가야하기에 주소값이 있습니다. 이러한 포인터의 메모리 주소값을 참조하는 포인터의 포인터를 이중 포인터라고 하며 이런 원리로 무한대의 다차원 포인터를 만들 수 있습니다. 다만 이중포인터까지만 종종 사용되고 실질적으로 2차원을 넘어서는 고차원 포인터는 잘 사용되지 않습니다. 이중포인터 사용법 int **ptr = NULL; 포인터를 선언할 때 ** 이런식으로 자료형 뒤에 *을 두 번 사용하면 포인터의 포인터(이중 포인터)를 선언할 수 있습니다. 이중 포인터 사용 예제 #include void main() { char ch = 'A'; char* ptr = NULL; char** ptr2 = NULL; ptr = &ch; //..
포인터 배열이란? 포인터 배열이란 말 그대로 포인터를 배열로 나열해놓은 것을 말합니다. 즉 포인터 변수의 배열이죠. 각각의 index에 여러 개의 포인터를 넣을 수 있습니다. char* arr[5]; int* arr[5]; void* arr[5]; 위와 같이 선언하여 사용합니다. char* arr[5]는 5개의 char형 포인터를, int* arr[5]는 int형 포인터 5개를 저장하고 있는 배열이 됩니다. 그냥 단순 주소값만 저장하고 싶을 때는 주로 void로 선언하며 이렇게 선언할 경우 이후 어떤 타입이든지 변환이 가능합니다. 포인터 배열 활용 예제 #include int main() { int num1 = 100; int num2 = 200; int num3 = 300; int* arr[3] = {..
int형의 값의 범위는 –2,147,483,648 ~ 2,147,483,647입니다. 이렇게 큰 숫자를 저장할 수 있는 공간이죠. 하지만 우리는 int타입에 이렇게 큰 값을 잘 넣어서 사용하지는 않습니다. 그렇다면 그만큼의 공간이 낭비되는 셈입니다. 그렇다면 int형을 반으로 나눠서 사용할 수는 없을까요? 가능합니다. 비트 연산자의 간단한 기법을 통해서 말이죠. 이렇게 된다면 하나의 int값 안에 2개의 값을 넣을수가 있게 되겠죠. 참고로 이러한 방법들은 실제 코딩에서는 잘 사용되지 않습니다. 메모리를 타이트하게 잡고싶다면 __int8, __int16과 같은 변수타입을 선언해서 사용하면 됩니다. 비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용) #include int main() { u..
2진수는 숫자를 표현할때 0과 1 두 가지 값으로만 표현합니다. 여기서 0과 1을 On / Off로 사용하는 개념을 비트 플래그라고 합니다. 이것을 어디에다 사용하냐?라고 반문하실 수도 있는데 전혀 사용성이 없는 것은 아니고 한 번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용할 수 있는 방법 중에 하나가 비트 플래그입니다. 비트 플래그를 사용하면 좀 더 공간을 효율적으로 사용할 수 있습니다. 단순 비교를 해보아도 8개의 상태를 저장하려면 bool 타입 변수 8개를 선언해야 할텐데 8비트의 char을 비트단위로 쪼개서 저장한다면 1개의 char 변수(1byte = 8bit)만으로도 8개의 상태를 저장할 수가 있죠. 비트 플래그 (Bit Flag) 사용 간단한 예제 #include int main(..
8진수나 16진수의 경우와는 달리 C언어에서는 2진수를 출력해줄 수 있는 서식 문자가 없습니다. 그렇기에 2진수는 직접 구해서 출력해야 하는데 일일이 2로 나누어 거꾸로 읽지 않아도 아래와 같이 비트 연산자를 사용하면 쉽게 구할 수 있습니다. 10진수를 2진수로 변환하여 출력하기 (비트연산 활용) #include int main() { unsigned int num; printf("정수를 입력해주세요\n"); scanf_s("%d", &num); printf("2진수 변환 : "); //이진수 출력 for (int i = 7; i >= 0; --i) { //8자리 숫자까지 나타냄 int result = num >> i & 1; printf("%d", result); } } 52를 바이너리로 8자리 숫자까..
C언어에서는 10진수를 8진수나 16진수로 변환해주는 서식문자를 제공합니다. 8진수는 %뒤에 o를 붙이면 되고 16진수는 %뒤에 x를 붙이면 됩니다. 또한 출력한 값이 8진수인지 16진수인지 %뒤에 #을 붙이면 알 수 있게 출력할수도 있습니다. 그리고 원하는 자릿수까지 0으로 채워서 출력할수도 있습니다. 아래 예제를 확인해주세요. 입력받은 10진수를 8진수, 16진수로 출력하기 #include int main() { int num; printf("정수를 입력해주세요\n"); scanf_s("%d", &num); printf("10진수 : %d\n", num); // 서식문자 : %d printf("8진수 : %o\n", num); // 서식문자 : %o printf("16진수(소문자) : %x\n", n..
보수란 보수는 보충을 해주는 수를 의미합니다. 현재의 숫자에서 자릿수가 1단계 올라갈 수 있는 수가 몇인지를 구하시면 됩니다. 보수 구하기 예시 10진수 1의 보수 : 1+9=10 -> 1의 보수 = 9 3의 보수 : 3+7=10 -> 3의 보수 = 7 2진수 1₂의 보수 : 1₂+ 1₂=10₂ -> 1₂의 보수 = 1₂ 10₂의 보수 : 1001₂+0111₂=11110₂ -> 1001₂의 보수 = 0111₂ 컴퓨터에서 보수가 필요한 이유 컴퓨터는 이진수만 이해할 수 있습니다. 그렇다면 음수는 어떻게 표현할 수 있을까요? 음수를 표현하기 위해 보수가 사용됩니다. 컴퓨터에서 보수는 양수를 음수화로 표현하기 위한 방법이 됩니다. 즉, 보충하는 수. 양수에 대한 보수가 음수입니다. 컴퓨터의 CPU는 뺄셈도 모..
진법이란? 진법이란 수를 표기하는 기수법의 하나로 몇 개의 기본 숫자를 이용하여 수를 표시하는 방법입니다. 자리값이 올라감에 따라서 수가 일정하게 커지는 규칙을 이용하고 수를 표시합니다. 우리가 일반적으로 사용하는 1 ~ 9까지의 숫자를 사용하여 수를 나타내는 방법을 10진법이라고 하며 프로그래밍에서 주로 사용되고 있는 진법은 아래와 같습니다. 위치의 가중치 모든 진법은 숫자의 위치에 따라 가중치가 달라지는 수입니다. 이 성질은 모든 진법에서 동일하게 적용되며 이 식을 사용하면 모든 진법들을 10진법으로 빠르게 바꿀 수 있습니다. 위의 경우 12345라는 10진법이 나오기 아래와 같은 식이 구해져야합니다. 계산식 : (1 * 10⁴) + (2 * 10³) + (3 * 10²) + (4 * 10) + 5 ..
어셈블리어란? 어셈블리어(assembly language)는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어입니다. 전류가 흐른다 그렇지 않다로 구성되는 0과 1의 이진수로 프로그램을 하는 기계어는 인간의 관점에서는 컴퓨터가 바로 읽을 수 있다는 점만 빼면 장점이 없는 언어이기 때문에 이를 보완하기 위해 나온 언어가 어셈블리어입니다. 기계어와 명령어가 1:1로 대응되는 단어들로 구성되어 있습니다. 고급언어는 컴파일하는 시간이 오래 걸리는 단점이 있는 반면 저급 언어는 컴퓨터와 가까운 언어이기 때문에 컴파일을 해도 간단한 명령으로 실행돼서 실행 속도가 굉장히 빠릅니다. 하지만 저급 언어는 배우기가 어렵고 유지보수가 힘들다는 이유로 특수한 경우를 제외하고는 사용되지 않고 있습니다. 하지만 임베디드..
명령어 Data Transfer 명령어 설명 MOV Move 데이터 이동 (전송) PUSH Push 오퍼랜드의 내용에 스택을 쌓는다. POP Pop 스택으로부터 값을 뽑아낸다. XCHG Exchange Register / memory with Register 첫번째 오퍼랜드와 두번째 오버랜드 교환 IN Input from AL/AX to Fixed port 오퍼랜드로 지시된 포트로부터 AX에 데이터 입력 OUT Output from AL/AX to Fixed port 오퍼랜드가 지시한 포트로 AX의 데이터 출력 XLAT Translate byte to AL BX:AL이 지시한 데이블의 내용을 AL로 로드 LEA Load Effective Address to Register 메모리의 오프셋값을 레지스터로 ..
C나 C++과 같은 고급 프로그래밍 언어는 컴파일을 거쳐 어셈블리가 됩니다. C나 C++와 같은 매우 민감한 언어들은 전혀 예상하지 못한 에러들이 자주 발생합니다. 해결방안에 대한 힌트를 찾을 때 상황에 따라서는 어셈블리 코드를 직접 확인해야 할 경우가 있습니다. Visual Studio에서는 컴파일된 어셈블리 코드를 직접 확인할 수 있는 기능을 제공합니다. 어셈블리 창 사용 설정 확인 도구 -> 옵션을 클릭하고 옵션창에서 디버깅 -> 일반에 들어간 뒤 주소 수준 디버깅 사용 체크박스가 체크되어있는지 확인합니다. 이것이 체크되어 있어야 디스 어셈블리 기능의 사용이 가능합니다. 어셈블리 코드 확인(DisAssembly) 디스 어셈블리 창을 보려면 분기점을 설정하고 F5를 눌러 디버그 모드로 실행해야 합니다..
Visual Studio 프로젝트에서 빌드를 하는 방법에는 릴리스(Release)와 디버그(Debug) 방식이 있습니다. 하지만 정확한 차이점은 모르시는 분이 많더군요. 대부분 Debug 버전은 디버깅용으로 Release 버전은 최종 배포용으로 빌드하는 것과 Relase 방식이 Debug 방식보다 빠르다 이 정도로만 알고 있지 이 두 가지의 정확한 차이점은 대부분 알지 못하는 듯하여 두 모드의 핵심적인 차이점 몇 가지를 이 포스팅에서 한번 정리해보고자 합니다. Release에서는 코드 최적화를 하고 Debug에서는 하지 않는다. 프로젝트 속성의 최적화로 들어가 보시면 Release는 위와 같이 최대 최적화로 되어 있는 반면 Debug는 사용 안 함으로 되어있는 것을 확인하실 수 있습니다. 여기서 코드 최..
이클립스를 사용하는데 글씨가 너무 작아서 글자가 제대로 보이지도 않고 눈에 피로감이 몰려오면 큰일이겠죠. 간단한 설정만으로도 이클립스의 폰트와 크기를 변경하실 수 있습니다. 이번 포스팅에서는 오늘은 이클립스의 글자 폰트와 크기를 바꾸는 방법에 대해서 알아보도록 하겠습니다. 단축키 활용 폰트 사이즈의 경우 단축키만으로도 간단히 조절할 수 있습니다. 에디터 창에 마우스 커서를 가져다 놓고 Ctrl + '+' or '-' 를 눌러주면 폰트 사이즈가 조정됩니다. 이클립스 폰트, 크기 설정하기 1. Window -> Preferences 창으로 들어갑니다. 2. General -> Color and Fonts를 눌러 Color and Fonts로 들어가준 뒤 바꾸고 싶은 언어를 클릭합니다. 전체를 바꾸고 싶으면 ..