이전 글에서 size_t 자료형 사용할 때 주의점을 적었었는데, 왜 unsigned 자료형과 signed 자료형을 연산할 때 unsigend로 변하는지 C99표준에 기반하여 설명하고 size_t(=unsigned int)와 int연산할 때 형변환 예시를 알려주겠다.
암시적 형변환은 대부분 자료형 크기가 작은쪽이 큰쪽으로 이동한다고 알고있다.
정수형 타입의 순위
char < short < int < long
실수형 타입의 순위
float < double < long double
대략적으로 보면 이렇게 되지만 같은 정수 자료형에서의 signed와 unsigned로 계산을 하면 어떻게 형변환이 이루어 지는 지도 알아 보겟다.
C99표준에서 형변환 순서
- 하나의 피연산자가 long double형 이면 다른 피연산자는 long double로 변환된다.
- 하나의 피연산자가 double형 이면 다른 피연산자는 double로 변환된다.
- 하나의 피연산자가 float형이면 다른 피연산자는 float로 변환된다.
- 'interger promotions'이라는 것이 수행된다. 이 규칙은 아래와 같다.
- 두 피연산자의 타입이 같으면 형변환이 되지않는다.
- 두 피연산자가 모두 unsigned 정수형 이거나 모두 signed 정수형일 때, 순위가 낮은 피연산자가 순위가 높은 피연산자로 형변환 된다.
- unsigned 정수형 피연산자가 다른 signed 정수형 피연산자에 비해 순위가 높거나 같을 때, signed 피연산자는 unsigned형으로 변환된다.
- signed 정수형 피연산자가 unsigned 정수형 피연산자의 값을 나타낼 수 있을 때, unsigned 정수형 피연산자는 signed 정수형 피연산자로 변환된다.
- 모든 피연산자들은 피연산자의 타입에 해당하는 unsigned 정수형으로 변환된다
이렇게 C99표준 형변환 순서를 이용해서 size_t(unsigned int)와 int형을 계산할 때 어떤 형태로 형변환 되는지를 알아보자.
size_t는 unsigned int 이므로 unsigned int 와 int형을 계산하면 'interger promotions'에 3번에 따라서 int가 unsigned int로 변환된다. 이 때 int가 음수라면 unsigned int로 변환될 때 값이 이상하게 변환되어 버리게 된다.
그래서 size_t와 int를 연산할 때 주의해야 된다고 설명한 것이다.
2023.01.12 - [C언어] - [C언어]size_t 자료형과 사용할 때 주의점(size_t VS unsigned int)
(출처 : C9899 표준)
6.3.1.8 Usual arithmetic conversions
- First, if the corresponding real type of either operand is long double, the other operand is converted, without change of type domain, to a type whose corresponding real type is long double.
- Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose corresponding real type is double.
- Otherwise, if the corresponding real type of either operand is float, the other operand is converted, without change of type domain, to a type whose corresponding real type is float.
- Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:
- If both operands have the same type, then no further conversion is needed
- Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank
- Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
- Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.
- Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.
'C언어 > C언어' 카테고리의 다른 글
[C언어]인클루드 가드의 뜻과 사용법(헤더가 꼬일 때,업계표준) (0) | 2023.02.15 |
---|---|
[C언어]#include <> 와 #include " " 차이 (0) | 2023.02.15 |
[C언어]size_t 자료형과 사용할 때 주의점(size_t VS unsigned int) (0) | 2023.01.12 |
[C언어]#include 의미 / 자료형 정리 (0) | 2023.01.09 |
[C언어]Clang 컴파일 시 newline-eof오류 해결법/ CMD cd 명령어 (0) | 2023.01.03 |
댓글