728x90
✓ int와 long 혹은 unsigned int 와 unsigned long의 차이
printf의 %p 서식지정자를 구현하던 중, unsinged int로 가변인자를 받게되면 문제가 생기는 일이 있었다.
unsigned long으로 말끔하게 고쳐주면 해결되는데 그 이유는 자료형의 메모리 크기에 있었다.
밑의 표를 보자.
- 자료형 메모리의 크기와 값의 표현 범위
많은 사이트에서 자료형의 범위와 크기를 다음과 같이 소개한다.
자료형 | 크기 (32비트 운영체제 기준) |
값의 표현범위 |
---|---|---|
int | 4bytes | -2,147,483,648 ~ +2,147,483,647 |
long | 4bytes | -2,147,483,648 ~ +2,147,483,647 |
unsigned int | 4bytes | 0 ~ 4,294,967,295 |
unsigned long | 4bytes | 0 ~ 4,294,967,295 |
이처럼 int와 long / unsinged int 와 unsigned long은 표현 범위도 크기도 같아보인다.
하지만, 자료형의 크기는 운영체제에 따라 달라진다는 점을 유의해야 한다.
실제로 맥 OS에서 다음과 같은 코드를 실행해보면, 다음과 같이 출력된다.
int main()
{
printf("int size : %d, long size : %d\n", sizeof(int), sizeof(long));
// int size : 4, long size : 8
printf("unsigned size : %d, unsigned long size : %d\n", sizeof(unsigned), sizeof(unsigned long));
return (0);
// unsigned size : 4, unsigned long size : 8
}
이는 운영체제가 64비트 운영체제 이기 때문이다.
이처럼 자료형의 메모리 크기는 운영체제에 따라 달라진다.
- 운영체제 별 자료형의 크기
자료형/운영체제 | 16비트 | 32비트 | 64비트 |
---|---|---|---|
int | 16bits(2bytes) | 32bits(4bytes) | 32bits(4bytes) |
long | 32bits(4bytes) | 32bits(8bytes) | 64bits(8bytes) |
- 혼동으로 인해 생길 수 있는 문제
void *의 크기는 8바이트 로 unsinged int(=크기 4바이트)를 통해서 형변환을 하게 되면 비트가 잘려서 출력되야할 결과가 다 출력되지 않고 부분이 잘릴 수 있다.
728x90
'공부 > C\C++' 카테고리의 다른 글
[C/C++] char *와 char []의 차이와 bus error (0) | 2021.03.31 |
---|---|
[C] 가변인자, 가변인자 함수 (0) | 2021.03.18 |
[C/C++] 구조체와 연결리스트 (0) | 2021.03.16 |
[C/C++] cin과 scanf의 차이 (0) | 2021.03.06 |
[C++] using namespace std는 무엇인가 (0) | 2021.03.06 |