자꾸 헷갈렸다. 이것도 사실 정수의 승격이랑 비슷한건데…
ㅤ
사실 아래 3가지는 모두 동일한 의미를 가진다. 뒤에 숫자를 적어서 값을 대입하는건 형식과 전혀 관계없는 과정임. 결국 일단 작성한 숫자는 int 타입으로 작성된 후에 변수에 맞는 타입으로 들어간다.
uint8_t a = 10;
uint8_t b = 0xA;
uint8_t c = 0b1010;
- 10 이라는 값이 CPU에서 로드됨 (
0x0000000A) 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_t→uint32_t→int64_t→uint64_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 에 대해서 파악할 때는 이런 공식문서를 확인해보는 것도 괜찮은 방법인 것 같다. 호호.
샤라웃
320x100
'Embedded System > C언어' 카테고리의 다른 글
| [C언어] Implementation-Defined Behaviour (0) | 2025.08.24 |
|---|---|
| [C언어] stdint.h 를 통한 타입 작성과 CLANG Header 읽기 개고생 (1) | 2025.08.24 |
| [C언어] 함수의 타입변환은 무죄 (4) | 2025.08.21 |