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

Embedded System/C언어

[C언어] 상수를 적으면 일단 int32_t?

sm_amoled 2025. 10. 18. 16:53

자꾸 헷갈렸다. 이것도 사실 정수의 승격이랑 비슷한건데…

사실 아래 3가지는 모두 동일한 의미를 가진다. 뒤에 숫자를 적어서 값을 대입하는건 형식과 전혀 관계없는 과정임. 결국 일단 작성한 숫자는 int 타입으로 작성된 후에 변수에 맞는 타입으로 들어간다.

uint8_t a = 10;
uint8_t b = 0xA;
uint8_t c = 0b1010;
  1. 10 이라는 값이 CPU에서 로드됨 (0x0000000A)
  2. uint8_t 타입에 맞춰서 가장 앞 2자리만 잘려서 a에 저장됨 (0x0A)

궁금증이 생겨서 조금 더 찾아봤다. 만약에 int 보다 큰 정수를 입력한 경우에는 어떻게 되나?

https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf

 

위 문서에서 6.4.4.2 Integer constants 파트를 한 번 보면, 이렇게 나와있다.

 

  • 숫자를 그냥 적으면 이건 일단 10진수 + int32_t 가 된다. 만약에 범위를 넘어선다면 int64_t 타입, int128_t 타입에도 숫자가 담길 수 있다. 단, 이렇게 decimal을 적은 경우에는 무조건 signed 임. 크기는 자동으로 늘려주더라도 unsigned는 전혀 고려하지 않는다.
  • 만약에 진법을 함께 적었다면, 일단 int32_tuint32_tint64_tuint64_t →… 이렇게 사이즈와 signed 여부를 알아서 조절해준다. 요것은 아마도 진법을 적용해서 적은 것을 보니 뭔가 bit 자리수를 계산해서 프로그래머가 작성했다고 믿고 넣어주는 것이 아닐까 궁예해본다. 🤨🤨
  • prefix 말고 Suffix를 붙여서 타입을 지정해줄 수도 있다. 이 경우에는 우선 int32_t를 거치지 않고 내가 지정한 타입, 형태로 일단 저장한다.
4294967295 == (unsigned int의 가장 큰 값) == 0xFFFFFFFF

sizeof(4294967295)
// 결과 : 8
// decimal constant 는 항상 signed 로 받기 때문에, 
// 이렇게 입력되어 있으면 int 의 범위를 벗어난 값이라 long 으로 올려서 입력받는다.

sizeof(0xFFFFFFFF)
// 결과 : 4
// 진법을 지정한 경우에는 크기를 보고 signed, unsigned를 판단해준다. 지금의 경우 4byte signed 의 범위를 넘어서지만 
// 4byte unsigned 의 범위에는 간신히 들어오므로 uint32_t로 타입을 지정한다

sizeof(4294967295U)
// 결과 : 4
// 진법을 지정하지는 않았지만, 이 숫자가 Unsigned 타입이라고 suffix를 통해 알려줬다.
// 그러면 처리할 때 컴파일러가 unsigned 타입의 4byte의 범위에 들어오는지 확인하는데,
// 4byte unsigned 의 범위에는 간신히 들어오므로 uint32_t로 타입을 지정한다

유의할 점!!!! 0을 앞에 붙이면 이거 8진수임 032 ≠ 32, 032 == 26 !!!! 또 봐도 놀라운 문법이네 진짜 ㅋㅋ

 

약간 의아한 점은, 64bit 아키텍처에서는 32bit의 정수 타입인 int32_t 로 굳이 변경할 필요 없이 int64_t 로 승격하는게 연산이 더 빠르지 않을까? 라고 생각이 들었다. 그래서 혹시 64bit에서는 8byte로 승격이 발생하나? 찾아보니 다음의 내용들이 있었다.

  • 32bit → 64bit 으로 넘어갈 때에는 메모리 주소 지정에 대한 니즈는 있었으나 int 타입의 확장 (4byte → 8byte) 에 대한 니즈는 없었음.
  • 전통적으로 int 타입은 32bit로 30년 넘게 사용해왔음. 이걸 함부로 변경하면 Portability 이슈와 호환성 이슈가 발생할 수 있음.
  • 일반적으로 CPU가 64bit 를 채택했다고 하더라도 32bit 정수 연산을 위해 나머지 32bit는 0으로 채워버리는 도구를 사용하기에 64bit 아키텍처에서 32bit 로 연산을 하더라도 느리지 않음. (오히려 값을 전달하는 비트 개수가 절반이기 때문에 더 빠를 수 있다.)

 

 

이런 디테일한 Behaviour 에 대해서 파악할 때는 이런 공식문서를 확인해보는 것도 괜찮은 방법인 것 같다. 호호.

 

샤라웃

https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf

320x100