#include #include #define ARRAY_SIZE 8int main() { double fnum; char *apcNumber[ARRAY_SIZE]; int iIndex=0; int count=0; int bin[64]={0}; int i,j=1,sum=0,toggle=1; int dResult=0, dTemp=1; unsigned long xsum[2]={0,0}; while(1) { printf("IEEE754 64bit(double type) Test...\n"); printf("input value : "); scanf("%lf",&fnum); for(iIndex=0; iIndex
다음과 같은 C 코드를 살펴보자.#include int main(){ float f; scanf("%f", &f); return 0;} 이 얼마나 간단명료한 코드인가! 에러가 나올 만한 부분이 전혀 없어 보인다. 하지만 Visual C++에서 이 코드를 실행시키면 어이없게도 런타임 에러가 뜬다. Release 모드에서 실행했을 때의 모습결론부터 말하자면, 이건 Visual C++의 버그다.scanf나 printf에서 "%f"를 이용해 실수를 입력받는 라이브러리는 엄청 크기가 크다. 그래서 Visual C++의 컴파일러는 이 라이브러리가 불필요하다고 판단되었을 경우에 아예 라이브러리를 실행파일에 포함시키지 않는다.문제는, 위의 코드처럼 실수를 입력받는 부분이 있더라도, 실수 변수를 한 번도 사용하지 않았다..
변수타입(자료형)이란 것은 사람이 편의에 의해 만들어낸 추상개념입니다. 실제로 컴퓨터에 존재하는 것은 단지 0과 1로 이루어진 2진수 뿐이죠. 사람들이 2진수에 자료형을 부여함으로써 어느 만큼의 2진수 묶음을 어떻게 해석할 것인가? 라는 기준을 정하게 됩니다. 32비트 컴파일러를 기준으로 봤을때 char 형은 2진수 8개( = 8비트 = 1바이트)를 한묶음으로 정의된 문자표(ASCII표)에 대응하여 특정 문자로써의 의미를 가집니다. int 형은 2진수 32개( = 32비트 = 4바이트)를 한묶음으로 십진수 정수로써의 의미를 가집니다.0 ~ 1111 1111 1111 1111 1111 1111 1111 1111 (2진수) 0 ~ FFFFFFFF (16진수) 0 ~ 4294967295 (10진수) 같은 범위..
32bit Single Precision(단정도 실수)부호비트(significant) 1bit지수부(exponent) 8bit가수부(mantissa) 23bit 64bit Double Precision(배정도 실수)부호비트 1bit지수부 11bit가수부 52bit 80bit Exitended Precision(확장정도 실수)부호비트 1bit지수부 15bit1가수부 63bit ※ (-1)s * 1.m * 2e - bias 형식으로 나타내는 것을 정규화라고 하며 각 s, m, e값을 메모리에 저장하게 된다. 마이너스 지수를 표현하기 위해서 지수부가 표현가능한 범위에서 bias값을 빼게 된다. 예를 들어 64bit Double Precision에서는 지수부가 211 = 2048 이므로 (1024 - 1)을 빼..
1. int 프로그래밍을 하는데에 있어서 가장 많이 쓰이는 것이 int형이라고 할 수 있습니다.int는 일반적으로 4바이트를 표현할 수 있으며 형의 범위는 -32768~32767인데, 이 int형이 메모리에 물리적으로 차지하고 있는 구조를 살펴보면 다음과 같이 표현됩니다. [ 1비트(부호비트) | 31비트] 여기서 부호비트란 말 그대로 부호를 표시해주는 비트를 말합니다. 1일 경우에는 음수를 나타내는 것이고, 0이면 반대로 양수라는 것을 나타냅니다. 이러한 구조가 정확히 어떻게 표현되는지 예를 들어보겠습니다. 정수 5를 한번 int형 메모리 구조로 표현해 볼까요? 먼저, 5는 음수가 아니니 부호비트가 0일 것입니다. 5를 2진수로 표현하면 101입니다. 정리해보면 앞에 1비트는 0, 뒤에 31비트는 00..
IEEE 754는 컴퓨터에서 소숫점을 표현하기 위한 방법이다. single precision은 32비트 즉 1워드에 저장하고 double precision은 64비트 즉 2워드에 저장한다. 이 비트를 3부분으로 나누어 음수, 소수부분, 지수부분으로 인식한다. (-1)^s * (1 + F) * 2^E F : fraction앞쪽 비트부터 2^-1, 2^-2... 를 의미한다. E : exponent지수부분 기본적으로 unsigned 이며 single precision에선 127, double에선 1023을 뺀다 S : sign부호 0이면 양수, 1이면 음수 single [sign : 1bit][exponent : 8bit][fraction : 23bit]double [sign : 1bit][exponent ..
1의보수란 무엇인가?0000 1010(2) 의 1의보수는 0000 0101(2) 이다. 방법은 간단하다. 1을 0으로 바꿔주고 0을 1으로 바꿔주는것이다. 그렇다면 2의 보수는 어떤것일까? 1의보수를 쓰게된이유는 음수를 나타내기 위해서이다. 그런데 1의 보수를 사용하게되면 문제가 생긴다. 그문제는 -0과 +0이 생긴다는것이다. 0000 0000 는 +0이고 1111 1111 은 -0이기때문에 쓸데없이 0이 두개나 생겨버리게된다. 그래서 고안한것이 2의 보수라는것이다. 먼저 어떻게 2의 보수를 만드는지 보도록하자 0000 1010(2) 의 2의보수 0000 0101(2)+1(2) = 0000 0110(2) 이다. 쉽지 않은가? 그럼 이제 2의보수를 사용해 뺄셈을 해보자. 사실 컴퓨터는 덧셈밖에 하지못한다...
10진수를 2진수 16진수로 바꿔보자꾸나 ※뒤에 아무말이 없는것은 10진수입니다. 65.75를 2진수로 바꾸어보자65.75 = 65 + 0.75 로 나타낼 수 있다. 먼저 65를 2진수로 변환한뒤 0.75를 2진수로 변환해 더해주면 된다. 간단하다. 눈으로 쭈욱 따라오시라 ^^ 2│65 └───── 2│ 32 ...1 △ └───── │ 2│ 16 ...0 │ └───── │ 2│ 8 ...0 │ └───── │ 2│ 4 ...0 △ └───── │ 2│ 2 ...0 │ └───── │ 1 ...0 │ ─────▷─┘ 화살표대로 읽어나가면 65 = 1000001(2) 가된다. 이젠 0.75를 2진수로 변환해보자. 0.75 × 2 ───── ①.50 ▽ ▽ 0.50 ▽ × 2 ───── ▽ ①.00 ▽ 화..