파도가 칠 때는 서핑을

Soon as possible

Wait!

공부/C\C++

[C/C++] int와 long, unsigned int와 unsigned long의 차이와 혼동으로 인한 문제점

hyeonhki 2021. 3. 18. 10:48
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