메모리에 정수를 표현하는 방법은 (1) 부호절대값 (2) 1의 보수 (2) 2의 보수와 같은 개념 체제 하에서 한다. 컴퓨터가 표현가능한 비트수는 아키텍처에 따르고, 컴파일러에도 조건되어진다. 우선 8비트라면 최상위 비트(MSB)가 부호 비트가 되고 나머지 7비트는 숫자를 이진법으로 표현하는 것인데, 부호 비트가 0이면 양수를 1이면 음수를 표현한다.
부호를 달아 표현하면 음수 표현이 되고, 아니면 양수만 표현이 된다. 부호를 안달면 모든 비트가 양수 표현에 쓰이므로 더 큰 범위의 정수가 표현된다.
그런데 비트수가 한정되어 있는데 정수 연산이 요청되어 비트수를 넘어가버리면 오버플로우가 발생한다.
이는 컴퓨터에서 실수(real numbers)를 표현할때도 그러한데 실수를 표현하는 방식인 부동소수(floating point number) 또한 표현가능한 비트가 한정되어 있으면 실수 공간에서 한정된 개수의 실수만 취해서 띄엄띄엄(discrete) 표현하게 된다.
우선 IEEE 754에서 정의한대로 C 컴파일러가 구현하는 얼개다. 32비트의 정밀도는 필수이고, 64비트 정밀도는 옵션 사항으로 원안에서는 그러하다.
32비트인 경우 float일때 부호 1비트, 지수 8비트, 가수 23비트
64비트인 경우 double일때 부호 1비트, 지수 11비트, 가수 52비트
이렇게 메모리를 차지하고 역시 오버플로우 원리가 있게 되면 숫자 표현에 난항이 있으나, 32비트와 64비트만 되더라도 그 범위가 충분해서 근사값이 되더라도 여러 기술들이 동원되어 정밀도가 보장된다. 비트수가 커지면 위의 표준안에서 보여지듯이 64비트 이중 정밀도인 경우 지수가 11비트라, 1023개의 경우의 수가 부여되어 정밀도가 높고, 가수에서도 52비트가 할당되므로 역시 표현 범위가 늘어난다. 즉 띄엄띄엄 표현해도 소수점 아래 표현 범위가 늘어나서 근사값의 정밀도가 높다.
소수점 이하 숫자도 이진수로 표현된다. 십진법으로 12.375라면, 정수부 12에 해당하는 이진표현이 1100이므로, 정수부는 쉽게 구해진다. 소수부 0.375는 매단계 소수부에 2를 곱해 나타내어진 식에서 정수만 취하고, 그 식에서 소수부만 0이 될때까지 2를 곱해 정수만 취해서 먼저번 연산에서 나중의 연산으로 얻어진 수가 비트값이 되어 이들을 읽으면 소수부의 이진 표현이 얻어진다. 예를 들면
0.375 * 2 = 0.750 = 0 + 0.750 — 0
0.750 * 2 = 1.500 = 1 + 0.500 —— 1
0.500 * 2 = 1.000 = 1 + 0.000 —— 1
이므로 0.375 = 0.011 이고, 12.375에 취하면 1100.011이 된다.
부동소수 표현에도 오버플로우 오류와 언더플로우 오류가 존재한다. 32비트 부동소수 표현에서는 -(1 – 2의 -24승) 곱하기 2의 128승인 범위보다 작아지면 음수 오버플로우가, -0.5*2의 -127승보다 커지면 음수 오버플로우가 나고, 0.5*2의 -127승보다 작아지면 양수 언더플로우가, (1-2의 -24승) 곱하기 2의 128승보다 커지면 양수 오버플로우가 발생한다. 오버플로우가 발생하면 때로는 비트 표현 범위를 넘게 되어 연산 결과가 제대로 유도되지 않는다.