두개의 정수를 입력받음, 첫번째 정수를 입력받아 16진수로 변환
두번째 정수를 입력받아 그 회수 만큼 2를 곱해 간다.
만약 2를 곱해 가다가 정수의 최대값이나 최소값을 벗어나는지 검사후 벗어나면 종료
두번째 정수는 양수여야 함.
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 8 // 16진수문자열의최대길이
#define INT_MAX 2147483647 // INT값의최대값
#define INT_MIN -2147483647 // INT값의최소값
char strwork1[MAX_SIZE + 1] = "";
char strwork2[MAX_SIZE + 3] = ""; // OX~
char *genhexchars(unsigned long num, int byte); // 함수원형
int main()
{
int num=0, count=0, i=0;
printf("\n>> Program Start <<\n");
printf("Enter the first integer(num) : ");
scanf("%d", &num);
/* num이0,overflow, underflow 인지체크후0이면다시입력받음*/
while((num == 0) || (num > INT_MAX) || (num < INT_MIN))
{
printf("Try again!! \n");
printf("Enter the fisrt integer(num) : ");
scanf("%d", &num);
}
printf("Enter the second integer(count) : ");
scanf("%d", &count);
/* count가양수인지체크후음수이면다시입력받음*/
while(count < 0)
{
printf("count < 0 !! Try again!! \n");
printf("Enter the second integer(count) : ");
scanf("%d", &count);
}
printf("----------------------------------------------------\n");
printf("%d => hex value: %s \n", num, genhexchars(num, 4)); // num값을16진수로출력
printf("%d times double........ \n", count); // count회2씩곱함
for(i=1; i<=count; i++)
{
/* num가양수이면INT의최대값초과를확인*/
if(num>0)
{
if(num > (INT_MAX/2))
{
printf("++++Overflow!!++++ \n");
break;
}
}
/* num가음수이면INT의최소값미만을확인*/
else
{
if(num < (INT_MIN/2))
{
printf("++++Underflow!!++++ \n");
break;
}
}
printf("%d : \t", i);
num = num << 1; // 2씩곱함: 왼쪽시프트이용
printf("%d => hex value: %s \n", num, genhexchars(num, 4));
}
printf("----------------------------------------------------\n");
printf(">> Program Exit <<\n");
return 0;
}
/* unsigned long형의정수로부터16진수문자열을생성하는함수*/
char *genhexchars(unsigned long num, int bytes)
{
int i = 0, j, length, halfbytecount = 0;
unsigned char ch;
/* 16진수용의문자배열*/
static unsigned char hexchars[] = { '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
'D', 'E', 'F' };
/* strwork2의앞부분에문자열을복사한다*/
strcpy(strwork2, "0x");
/* 숫자를16진수의문자열로변환한다*/
while (i < MAX_SIZE)
{
/* 16의나머지를구한다*/
ch = (unsigned char) num % 16;
/* 하프바이트를16진수로표현한다*/
strwork1[i++] = hexchars[ch & 0x0f];
/* 4비트오른쪽으로쉬프트한다*/
num >>= 4;
/* 자료형별로바이트처리가끝나면종료한다*/
if (++halfbytecount / 2 == bytes)
break;
}
/* 끝에널문자를대입한다*/
strwork1[i] = '\0';
/* 문자열의길이를조사한다*/
length = strlen(strwork1);
/* 문자열을역순서으로재배치한다*/
for (i = 0, j = length - 1; i < j; i++, j--)
{
ch = strwork1[i];
strwork1[i] = strwork1[j];
strwork1[j] = ch;
}
/* 결과를strwork2에연결한다*/
strcat(strwork2, strwork1);
return strwork2;
}
'컴&프로그래밍 > C' 카테고리의 다른 글
팩토리얼 수 구하기 (재귀함수) (0) | 2014.10.24 |
---|---|
피라미드 별찍기 (0) | 2014.10.12 |
정수부분, 소수부분 2진수 변환 (0) | 2014.10.11 |
이진검색 (0) | 2014.10.11 |
파일 복사 하기 (0) | 2014.10.11 |
학생 정보 입력 받아 성적순으로 내림차순 정렬 출력 (1) | 2014.10.11 |
진법 계산 (0) | 2014.10.11 |
대소문자 바꿔서 출력 (0) | 2014.10.11 |
3n + 1 문제 (The 3n+1 Problem) (0) | 2014.10.11 |