sizeof()
unsigned int i = 0;
printf("%u\n", sizeof(unsigned int));
printf("%u", sizeof(i));
자료형의 크기를 알아보는 연산자로 사용하는 형식은 함수하고 비슷하다.
sizeof(자료형 or 변수)
VS(통합개발환경)에서는 sizeof(unsigned int);라고 입력하고 마우스를 가져가면 크기를 알려주지만 컴파일러를 통해 알고 싶으면 printf함수를 사용해야한다.
이 때 printf함수에 형식 지정자를 선택 할 때, 우변에 나오는 자료형과 맞춰줘야 한다.(unsigned int의 형식 지정자는 unsigned의 약자인 u) 다른 형식 지정자를 사용하면 범위에 벗어난 값을 요구하는 경우 오류가 난다. 범위에 포함되는 값은 오류가 나지 않아서 잘못된 것을 깨닫지 못하는 경우가 생기는데 이게 어려운 부분이다.
오버플로우
unsigned int 타입을 사용할 때 변수(i)가 가질 수 있는 최대 값과, 최소 값이 몇인지를 알고 그 범위 안에서 사용해야한다. 그 범위를 벗어나면 메모리가 감당 할 수 없게 된다. 그것을 오버플로우라고 한다.
최대 값 알아보는 방법
1. sizeof(unsigned int); 로 알아낸 크기로 알아보기
#include<stdio.h>
int main()
{
unsigned int i = 0b11111111111111111111111111111111;
printf("%u\n", i);
return 0;
}
* 0b
뒤에오는 리터럴상수들이 2진수라는 뜻으로 아무것도 없이 사용하면 10진수. C언어에서 표준은 아니지만 많이 사용하는 것이라 컴파일러에서 지원해준다.
* unsigned int
unsigned 4바이트로 32bit 즉, 최대 32자리를 갖는다.
2진수로 표현하면 11111111111111111111111111111111
10진수로 표현하면 4294967295(4294967296인 아닌 이유 : 2의32제곱은 가지수이고 unsigned는 0부터 시작 하기 때문에 1을 빼줘야 최대값이 된다.)
2. #include<limits.h>
#include<stdio.h>
#include<limits.h>
int main()
{
unsigned int u_max = UINT_MAX;
unsigned int u_min = 0;
signed int i_max = INT_MAX;
signed int i_min = INT_MIN;
printf("max of uint = %u\n", u_max);
printf("min of uint = %u\n", u_min);
printf("max of int = %d\n", i_max);
printf("min of int = %d\n", i_min);
return 0;
}
* 각각의 자료형이 가질 수 있는 가장 큰 값과 가장 작은 값을 알려준다.
* _MAX; 와 _MIN;
unsigned 최소값은 0으로 매크로를 사용하지 않는다.
UINT_MAX : unsigned integer 최대값을 알아보는 매크로선언
INT_MAX : signed integer 최대값을 알아보는 매크로선언
INT_MIN : signed integer 최소값을 알아보는 매크로선언
오버플로우 될 경우
#include<stdio.h>
#include<limits.h>
int main()
{
unsigned int u_max = UINT_MAX + 1;
printf("%u\n", u_max);
return 0;
}
* 결과는 0으로 오류가 뜨고 컴파일러도 overflow라는 경고를 준다.
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
int main()
{
unsigned int u_max = UINT_MAX;
// UINT_MAX + 1;의 경우 결과값 0
// 0 - 1;의 경우 결과값은 최대값
// i to binary representation
char buffer[33];
_itoa(u_max, buffer, 2);
// print decimal and binary
printf("decimal: %u\n", u_max);
printf("binary: %s\n", buffer);
}
* 변수 u_max가 담고있는 숫자를 2진수 형태로 바꿔주는 코드
char buffer[33];
_itoa(u_max, buffer, 2);
* 2진수 형태로 출력해주는 코드
Printf("binary: %s\n", buffer)
* 최대값을 넘어 가 버릴 경우의 결과 값 = 0
예를 들어 '1111 + 1 = 10000'의 경우 4자리수밖에 저장 할 수 없으니 맨 앞에 숫자가 날아가 버린다.
* 최소값을 넘어 가 버릴 경우의 결과 값 = 최대값
예를 들어 '0000 - 1 = 1111'의 경우 앞에 1을 만들어서 계산해 버려서 최대값으로 결과값이 나와버린다.
'프로그래밍언어 > C언어' 카테고리의 다른 글
[C language] 8진수와 16진수 (0) | 2020.12.09 |
---|---|
[C language] 다양한 정수형들 (0) | 2020.12.09 |
[C language] 정수와 실수 (0) | 2020.12.09 |
[C language] 간단한 입출력 프로그램 만들기 (0) | 2020.12.02 |
[C language] scanf() 함수의 기본적인 사용법 (0) | 2020.12.01 |