Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

TIL

[250812] Day 2 - 익숙해질듯 한 2일차

sm_amoled 2025. 8. 12. 17:54

들어가며

일요일에 달리기를 하면서 무리가 왔던 왼쪽 발바닥이 아직도 아프다 ㅜㅜ.

비골근염? 이라는 이름의 무언가 같은데, 족저근막염이랑은 또 다른 염증질환인가봄. 우선은 소염진통제로 버티고 있는데, 한 목요일 정도까지 경과를 보고 병원을 방문하던지 해야겠다.

이제 일상의 패턴을 좀 만들어야 하는데, 크로스핏 끝나고 바로 출발하면 제시간안에 들어올 수 있을지 한 번 테스트를 좀 해봐야할 것 같다. 우선 발 좀 낫고…

오늘의 키워드

Expression과 Statement

C언어에 있는 모든 연산자는 Expression이다. 의외로 C에서도 대입연산자 = 는 expression이였다.

대입 연산자는 Expression이다. 아래처럼 = 대입 연산자와 += 대입 연산자 둘 다 expression으로 사용할 수 있다. C에서도 이렇게 식 중간에 대입을 수행할 수 있다.

int a = 5;
int b = 3;

int res;

res = (a > (b=7)) ? a : b;
res = (a > (b+=7)) ? a : b;

콤마 연산자 , 또한 Expression이다. 이렇게 코드 실행을 쓸 수 있는 건 처음 알았다. 아마도 작업 후 Wrap-up을 위한 코드를 이렇게 작성하면 좋을 것 같음. (메모리 할당 작업 이후 해제 작업 등?

like finally

)

void func1() {
    printf("hello, ");
}

void func2() {
    printf("world!\n");
}

int newFunction() {
    // func1 실행 -> func2 실행 -> 5 반환
    return (func1(), func2(), 5);
}

괄호를 잘 쓰자

괄호는 쓰더라도 컴파일 과정에서 걸러져서 성능상에 영향을 주지 않는다.

연산 우선순위에 대한 가독성을 높이기 위해서 적절하게 잘 활용하자.

특히 연산자간의 우선순위 (bit 연산자 / +- 연산자 / << >> 연산자 등)의 우선순위가 헷갈림. 자주 확인해주기!

정수, 실수의 승격

어제 마주쳤던 의심스러운 sizeof 동작이 기능이었다는걸 알게되었다.

int main(void) {
    // 정수인데 int보다 작은 사이즈면 다 4byte(int size)로 맞춰서 전달
    // 실수인데 double보다 작은 사이즈면 다 8byte(double size)로 맞춰서 전달

    char x = 127;
    char y = x + 1;

    printf("x = %d, x + 1 = %d, y = %d\n", x, x + 1, y);
    printf("sizeof / x = %d, x + 1 = %d, y = %d\n", sizeof(x), sizeof(x + 1), sizeof(y));
    printf("\n");

    float ff = 100.5;
    float gg = ff + 0.5;

    printf("ff = %f, ff + 0.5 = %f, gg = %f\n", ff, ff + 0.5, gg);
    printf("sizeof/ff = %d, ff + 0.5 = %d, gg = %d\n", sizeof(ff), sizeof(ff + 0.5), sizeof(gg));
    printf("\n");

    // 근데 float + int 연산을 할 때는 1이 float가 되어서 4byte로 연산됨
    // 요거슨 4byte + 4byte라 그런 것 같음
    float f = 100.01;
    float g = f + 1;

    printf("f = %f, f + 1 = %f, g = %f\n", f, f + 1, g);
    printf("sizeof/f = %d, f + 1 = %d, g = %d\n", sizeof(f), sizeof(f + 1), sizeof(g));
    printf("\n");

    return 0;
}

/// 실행결과
x = 127, x + 1 = 128, y = -128
sizeof / x = 1, **x + 1 = 4**, y = 1

ff = 100.500000, ff + 0.5 = 101.000000, gg = 101.000000
sizeof/ff = 4, **ff + 0.5 = 8**, gg = 4

f = 100.010002, f + 1 = 101.010002, g = 101.010002
sizeof/f = 4, **f + 1 = 4**, g = 4

연산 결과를 변수에 넣고나면 다시 float로 크기가 돌아온다. 리터럴을 이용하는 연산 중에는 정수는 최소 4byte / 실수는 최소 8byte로 변환되어 수행된다는 것이 승격.

 

다만 실행결과를 보면 float + 1의 타입은 float 이지만, float + 0.5의 타입은 double임을 볼 수 있다. float + int 에서는 굳이 double로 형변환을 할 필요가 없기 때문인 듯 하다.

그리고, 여기에 대한 승격 규칙도 있다!

 


[승격 규칙]
long double (최상위)

double

float

unsigned long

long ⇒ 4byte

unsigned int

int (하위) ⇒ 찾아보니 2byte or 4byte / 현재 컴파일러에서는 4byte

이 아래에 있는 것들은 signed int로 변환되어 처리됨!

int보다 작으면 int로 변환되어 처리되기에, char + char는 int로 변환되어 처리

 

📌 유의사항

signed → unsigned 으로 변환한다고 하더라도 padding은 signed bit으로 채워짐

⇒ char 0xF0 을 unsigned int로 변환한다고 하더라도 0xFFFFFFF0 이 된다. 그래서 무지막지하게 큰 수로 읽힘.

근데 unsigned → signed 변환에서는 padding이 0이 붙음!

320x100