728x90

2024/10 56

2의 보수(Two's complement)란?

2의 보수를 알기 전에 1의 보수를 알아야 한다.1의 보수란 모든 비트를 반전시켜 양수를 음수로 변환하는 방법이다. 즉, 0을 1로, 1을 0으로 바꾸는 것이다.예를 들어, 8비트로 양수 10을 표현하면 00001010이 되는데, 이를 1의 보수로 변환하면 11110101이 된다. 이 방식은 음수를 나타내는 간단한 방법이지만, 덧셈을 수행할 때 문제가 발생할 수 있다. 특히, 1의 보수를 사용한 경우 결과에 대해 캐리 비트를 따로 처리해야 하는 문제가 있다. 2의 보수는 1의 보수를 이용해 음수를 표현하는 좀 더 발전된 방법이다. 1의 보수를 구한 후, 여기에 1을 더하면 2의 보수를 얻을 수 있다. 똑같이 8비트로 양수를 10을 표현한 00001010의 1의 보수는 11110101이며, 여기에 1을 더..

CS 2024.10.23

[C언어] unsigned int flags -1 에 대해서

C와 C++ 프로그래밍을 하다 보면 모든 비트를 1로 설정하기 위해 다양한 방법이 사용된다.unsigned int flags = -1;unsigned int flags = ~0;unsigned int flags = 0xFFFFFFFF; 위의 방법이 어떻게 동작하는지, 가장 이식성 있는 방식은 무엇일까. unsigned int flags = -1;이 방법은 음수 값을 unsigned 타입에 할당하는 형태이다. C 표준에서는 signed 값을 unsigned로 변환할 때 모듈로 연산을 수행한다. 플랫폼마다 unsigned int의 크기가 달라도 항상 최댓값으로 설정되므로 이식성이 뛰어나다.unsigned int flags = ~0;~0은 비트 NOT 연산을 통해 0의 비트를 반전시켜 모든 비트를 1로 만든다..

C언어 2024.10.23

[C언어] 주석이란?

주석은 C언어뿐만 아니라 모든 언어에서 사용하게 된다. 코드의 의미를 명확히 하게 위해 존재하며, 단순히 코드가 무엇을 하는지를 넘어 왜 그렇게 작성되었는지를 설명하는 것이 중요하다. 주석의 사용법을 봐보자.#include /** * @brief 전달받은 이름을 출력하는 함수 * * @param Name 출력할 이름 (문자열 포인터) */void printMyName(char *Name) { printf("%s\n", Name); // 이름 출력}int main(void) { char myName[] = "홍길동"; /* char myName[] = "김강민"; char myName[] = "이윤찬"; */ printMyName(myName); retur..

C언어 2024.10.22

[C언어] 단락 평가

C언어 if문에 대해서 찾아보다가 if(조건문 1 && 조건문 2) 일 때 조건문 1이 참일 때 더 효율적으로 작동한다는 이야기를 들었다.그래서 뭐지 하고 찾아보니 이것을 단락 평가(Short Circuit Evaluatin)라고 한다. 단락 평가란, 논리 연산에서 전체 조건이 이미 확실해지면 나머지 조건을 더 이상 평가하지 않는 최적화 기법이다.이것의 핵심은 필요 최소한의 연산만 수행하는 것이다.  예시 코드if (ptr != NULL && *ptr == value) { // ptr이 NULL이 아닐 경우에만 *ptr이 평가됨} ptr이라면 두 번째 조건인 *ptr == value는 평가되지 않는다. 이렇게 함으로써 NULL 포인터 참조로 인한 런타임 오류를 방지할 수 있다. 특정 조건을 먼저 평..

C언어 2024.10.22

[C언어] gets()의 결함

gets 함수는 C언어에서 문자열을 입력받을 때 사용되었던 함수이다. 표준 입력(stdin)을 통해 문자열을 읽어와 사용자가 제공한 버퍼에 저장하는 간단한 기능을 한다. 예전에는 사용자로부터 데이터를 쉽게 받을 수 있는 방법으로 많이 사용되었으나, 그 과정에서 심각한 보안 문제가 있는 것이 밝혀졌다. 고1 때 C로 알고리즘을 풀며 gets를 사용했던 기억이 있다. 버퍼 오버플로우 위험gets 함수의 가장 큰 문제는 버퍼 크기 제한이 없다는 것이다. 사용자가 입력할 데이터의 길이를 제한하지 않기 때문에, 할당된 버퍼 크기를 초과하는 입력을 받을 경우 버퍼 오버플로우가 발생할 수 있다. 이는 메모리 상의 다른 데이터 영역을 덮어쓰게 되어 프로그램의 정상적인 동작을 방해하거나 예기치 않은 행동을 유발할 수 있..

C언어 2024.10.21

[C언어] 인라인(inline) 함수란?

C99부터 지원하는 inline 함수란 말 그대로 함수 호출을 호출된 자리에서 직접 삽입하는 방식의 최적화 기법이다. 일반적으로 함수를 호출하면 함수의 주소로 이동한 후 실행하고, 완료된 후 다시 원래 위치로 돌아온다. 이러한 과정은 시간적 오버헤드를 수반하며, 이는 특히 자주 호출되는 함수일수록 성능에 악영향을 미칠 수 있다. inline 함수는 이러한 문제를 해결하기 위해, 함수 호출 과정 없이 함수의 코드 자체를 호출 지점에 삽입하는 방식으로 최적화를 수행한다. inline 키워드를 사용한다고 해서 모든 함수가 자동으로 인라인 처리되는 것은 아니다. 컴파일러는 함수의 크기나 복잡성을 고려하여 inline 요청을 무시할 수도 있다. 함수가 너무 커서 인라인 처리 시 코드 크기 증가가 성능 저하로 이어..

C언어 2024.10.21

[C언어] 타입 한정자(type qualifiers)란?

C언어에서 타입 한정자(type qualifiers)는 변수나 포인터의 특성을 지정해 주는 키워드이다. 이들은 데이터 사용 방법을 더 명확히 하여, 최적화하거나 안전한 코드를 작성하는 데 도움을 준다.  1. constconst는 변수를 상수로 지정하여 해당 변수의 값을 변경하지 못하도록 한다.변수를 변경하려고 하면 컴파일러가 오류를 발생시킨다. 이 한정자를 사용하면 코드의 안전성을 높일 수 있다.const int maxValue = 200;maxValue = 300; // 오류 발생 2. volatilevolatile는 컴파일러에게 변수가 외부에서 변경될 수 있음을 알리는 한정자이다.컴파일러 최적화가 이러한 변수를 무시하지 않도록 하여 항상 최신 값을 사용하도록 보장한다.https://tgmalacom..

C언어 2024.10.18

GCC(GNU Compiler Collection)란?

GCC(GNU Compiler Collection)은 여러 프로그래밍 언어를 컴파일할 수 있는 강력한 컴파일러 모음집이다. 처음에는 C언어의 컴파일러로 시작했지만, 현재는 C++, Ada 등 다양한 언어를 지원한다.오픈 소스로 제공되기 때문에 누구나 자유롭게 사용하고 수정할 수 있다는 점이 큰 장점이다. GCC의 동작 과정전처리 (Preprocessing): 전처리는 소스 코드에서 #include, #define과 같은 전처리 지시자를 처리하는 단계이다. 컴파일 (Compilation): 전처리된 코드를 어셈블리 언어로 변환하는 단계이다. 어셈블 (Assembly): 어셈블리 코드를 기계어로 변환하는 단계이다. 링크 (Linking): 여러 개의 목적 파일들을 결합하고, 외부 라이브러리와 연결하여 최종 ..

C언어 2024.10.18

[C언어] 다중 평가 문제

오늘은 C언어의 다중 평가 문제에 대해서 알아보도록 하겠다.다중 평가 문제란 매크로에서 매개변수를 여러 번 평가함으로써 예상치 못한 결과가 발생하는 문제를 말한다. 특히 매개변수가 함수 호출이나 증감 연산자 같은 표현일 때 문제가 될 수 있다. 매크로는 텍스트 치환 방식으로 처리되기 때문에, 매크로 내부에서 매개변수를 여러 번 사용하면 그 매개변수가 반복 평가되게 된다. 예시)#define ABS(a) ((a) > 0 ? (a) : (-(a)))int x = 3;int result = ABS(x++);위 코드에서 ABS(x++)를 호출하게 되면, 매크로 다음과 같이 치환하게 된다.result = ((x++) > 0 ? (x++) : (-(x++)));1. (x++) > 0 에서 x++를 거쳐 4가 된다...

C언어 2024.10.17

[C언어] typedef uint8_t BOOL

https://stackoverflow.com/questions/58747149/typedef-uint8-t-t-bool-is-it-still-worth-it typedef uint8_t T_BOOL; Is it still worth it?I am reviewing coding guidelines for C and we still have the guideline to typedef uint8_t for booleans. I work for a company in the automotive industry, therefore doing embedded software and usuallystackoverflow.com스택오버플로우에도 나와있고 직접 직면한 문제에 대해서 얘기해 보자.문제 겸 궁금증은 이 ..

C언어 2024.10.17
728x90