C 언어 연산자와 이진수 변환

연산자 유형 분류

C 언어에서 사용되는 주요 연산자 카테고리:

  • 산술 연산자: +, -, *, /, %
  • 비트 이동 연산자: <<, >>
  • 비트 연산자: &, |, ^
  • 대입 연산자: =, +=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=
  • 단항 연산자: !, ++, --, &, *, +, -, ~, sizeof, (타입)
  • 관계 연산자: >, >=, <, <=, ==, !=
  • 논리 연산자: &&, ||
  • 조건 연산자: ? :
  • 쉼표 연산자: ,
  • 배열 인덱스: [ ]
  • 함수 호출: ( )
  • 구조체 접근: . , ->

진법 체계와 변환

진법은 수치 표현 방식으로, 일상에서도 60초(60진법), 12개월(12진법) 등 다양한 예시가 존재합니다.

숫자 12의 각 진법 표현:

  • 2진수: 1100
  • 8진수: 14
  • 10진수: 12
  • 16진수: C

2진수를 10진수로 변환

11002 → (1×2³) + (1×2²) + (0×2¹) + (0×2⁰) = 1210

10진수를 2진수로 변환

12510 변환 과정:

125 ÷ 2 = 62 ... 1 (LSB)
62 ÷ 2 = 31 ... 0
31 ÷ 2 = 15 ... 1
15 ÷ 2 = 7 ... 1
7 ÷ 2 = 3 ... 1
3 ÷ 2 = 1 ... 1
1 ÷ 2 = 0 ... 1 (MSB)
∴ 1111101<sub>2</sub>

2진수 → 8진수 변환

011010112 → 3비트 단위 분할: 001 101 011 → 1 5 3 → 01538

2진수 → 16진수 변환

011010112 → 4비트 단위 분할: 0110 1011 → 6 B → 0x6B

원코드, 반코드, 보수

정수 표현 방식:

  • 원코드: 부호 비트(0:양수, 1:음수) + 절대값
  • 반코드: 원코드에서 부호 비트 제외 비트 반전
  • 보수: 반코드 + 1

양수: 세 표현 동일
음수: 각 표현 상이
메모리에는 보수 형식 저장

비트 이동 연산

정수만 연산 가능

좌측 시프트 (<<)

규칙: 왼쪽 초과 비트 삭제, 오른쪽 0 채움
예: 5<<1 → 1012 → 10102 = 10

우측 시프트 (>>)

두 가지 방식:

  • 논리 시프트: 왼쪽 0 채움
  • 산술 시프트: 왼쪽 부호 비트 채움

비트 단위 연산

정수 대상 연산자:

  • & (AND): 비트 모두 1일 때 1
  • | (OR): 비트 중 1이 있으면 1
  • ^ (XOR): 비트가 다르면 1
  • ~ (NOT): 비트 반전

비트 AND 예제

#include<stdio.h>
int main() {
    int valA = -2;   // 보수: 111...1110
    int valB = 5;    // 보수: 000...0101
    int result = valA & valB; // 000...0100 (4)
    printf("%d\n", result);
}

비트 OR 예제

int result = valA | valB; // 111...1111 → -1

비트 XOR 예제

int result = valA ^ valB; // 111...1011 → -5

비트 NOT 예제

int result = ~valA; // 000...0001 → 1

쉼표 표현식

왼쪽에서 오른쪽으로 실행, 마지막 표현식 결과 반환

int x = 1, y = 2;
int z = (x > y, x = y + 10, y = x + 1); 
// z = 13

배열 인덱스 연산자

배열명[인덱스] 형태

int arr[5];
arr[2] = 100;  // 배열과 인덱스 2개 피연산자

함수 호출 연산자

함수명(인자) 형태

int calc(int a, int b) { return a + b; }
int sum = calc(3, 4);  // calc, 3, 4 피연산자

구조체 접근 연산자

직접 접근 (.)

struct Coord { int x; int y; };
struct Coord pos = {1, 2};
printf("X: %d, Y: %d", pos.x, pos.y);

포인터 접근 (->)

struct Coord *ptr = &pos;
ptr->x = 10;

연산자 우선순위와 결합성

  • 우선순위: 연산 실행 순서 결정
  • 결합성: 동순위 연산 처리 방향

우선순위 예시: * > +
결합성 예시: = 는 우측 결합

표현식 평가

정수 승격

char, short 연산 시 int로 변환 후 처리

  • 부호 있음: 부호 비트 확장
  • 부호 없음: 0으로 채움

산술 변환

피연산자 타입 불일치 시 상위 타입으로 자동 변환

타입 계층 (낮음 → 높음):

  1. int
  2. unsigned int
  3. long int
  4. unsigned long int
  5. float
  6. double
  7. long double

태그: C언어 비트연산 진법변환 이진수 보수표현

7월 20일 16:54에 게시됨