본문 바로가기
코딩Language(전공)

[전공_시스템프로그래밍] 정수(Integer) 데이터타입

by Nerdogger 2019. 9. 9.

컴퓨터는 모든 수를 0과 1로 표현한다.

먼저 정수(Integer)의 표현을 살펴보자.

 

정수는 이름그대로 부호를 갖는다.

컴퓨터에서는 Unsigned Integer, Signed Integer 이렇게 두가지로 나누는데

같은 이진수의 정수여도 Unsign이냐 Signed냐에 따라서 표현되는 값이 다른다.

 

예를 들면 

16진수 2진수 Unsigned Signed
0x51 0101 0001 81 81
0xD9 1101 1001 217 -39

두가지 경우를 예로 들수 있는데 

Signed 10진수 x

Unsigned 10진수 Ux 라 할때 

x>=0 이면 x와 Ux가 같다.

하지만 x<0 이면 Ux값은 매우 커지는 것을 볼수 있다.

 

데이터 타입변환을 일반화 하면,

해당 데이터 타입에서 최대값을 TMax라 할때

ux = x (x>=0)

ux = x+2^w (x<0)

x = ux (x<=TMax)

x = ux - 2^w (x>TMax)

이렇게 나타난다.

 

C언어에서는 부호형 정수와 비부호형 정수와의 호환을 위해서 변환을 허용하는데 이것을 Casting이라고 한다. 

수식계산시에 부호형과 비부호형 정수값들이 한개의 수식내에 섞여 있는 경우 비부호형정수로 모두 바꾸어 계산한다.

여기서 일반수학에서는 나타나지않는 현상이 일어나는데,

이 현상을 "Casting 충격" 이라고 한다.

예를 들면 

Constant1 Constant2 Relation Evaluation
-1 0 < signed
-1 0U > unsigned
2147483647 2147483648U < unsigned
2147483647 (int) 2147483648U > signed

위 표에서 보면 -1과 0의 경우 일반적으로는 아무 표기가 없으면 signed로 캐스팅되서 0이 더 큰 수이다.

하지만 0U, 둘중 하나가 unsigned인 경우 signed였던 -1(x<0)이 unsigned로 캐스팅되어 양수의 형태로 변환된다.

 

다음 경우는 signed인 2147483637(x>=)이 unsigned로 캐스팅되는데 이 경우 변환되어도 두 데이터타입의 값이 같으므로  원래 컷던 2147483648U이 크다.

하지만 표 맨 밑줄의 경우 Constant2의 값이 unsigned이지만 int로 선언되어 오버플로우가 발생하므로 

이 경우 둘다 signed로 캐스팅되어 계산되는데

여기서 Constant2가 x>TMax에 해당되어 x=ux-2^w, 즉 음수로 변환된다. 

그래서 Constant1 > Constant2이 된다.

 

요약하면 아래와 같다.

두 타입의 변수 관계를 비교하는 경우 unsigned로 캐스팅하여 비교

But, usigned값이 해당변수의 TMax를 초과할 경우 signed로 캐스팅하여 비교