문제 출처 : YES C (정보공학연구소/생능출판사)
6. 16진수 ABC + BBC를 계산하는 프로그램을 작성하라.
#include <stdio.h> void main() { int a = 0xABC, b = 0xBBC; printf("%x + %x = %x",a, b, a+b ); }
7. 두 8진수 x,y를 키보드로 입력받아 사칙연산을 하는 프로그램을 작성하라.
#include <stdio.h> void main() { int x, y; printf("첫번째 8진수를 입력하세요. :"); scanf_s("%o", &x); printf("두번째 8진수를 입력하세요.(0제외) :"); scanf_s("%o", &y); //8진수와 16진수는 일반적으로 부호를 갖는 형태로 쓰지 않기 때문에 음수값이 나올경우 쓰레기값이 나온다. //그래서 10진수로 변경해서 계산했다. printf("\n입력받은 값을 10진수로 변경하면 x = %d, y = %d입니다. \n", x, y);
printf("%d + %d = %d \n", x, y, x + y); printf("%d - %d = %d \n", x, y, x - y); printf("%d * %d = %d \n", x, y, x * y); //y값이 0이면 런타임 에러가 난다. printf("%d / %d = %d \n", x, y, x / y); }
8. 두 정수 a, b를 입력받아 더한 결과를 8, 10, 16진수로 출력하는 프로그램을 작성하라.
#include <stdio.h> void main() { int a, b; printf("첫번째 정수를 입력하세요 : "); scanf_s("%d", &a); printf("두번째 정수를 입력하세요 : "); scanf_s("%d", &b); printf("\n"); printf("두 정수의 합은 \n"); printf("8진수로 %o, 10진수로 %d, 16진수로 %x 입니다. \n", a + b, a + b, a + b); }
9. scanf_s(), printf()를 이용하여 삼각형, 사각형의 넓이를 구하는 프로그램을 작성하라. 이 때 결과값을 화면 가운데에 출력할 수 있도록 하라.
//출력을 화면 가운데로 하라는 말이 이해가 안되서 그냥 자리수를 조정했다. //콘솔창에서 커서를 이동시키는 함수도 있지만 굳이 사용하지 않았다. #include <stdio.h> void main() { int a, b; printf("계산할 삼각형의 밑변을 입력해주세요 : "); scanf_s("%d", &a); printf("계산할 삼각형의 높이를 입력해주세요 : "); scanf_s("%d", &b); printf("\n 입력하신 삼각형의 넓이는 \n %40d \n 입니다. \n", a*b/2); printf("계산할 사각형의 가로를 입력해주세요 : "); scanf_s("%d", &a); printf("계산할 사각형의 세로를 입력해주세요 : "); scanf_s("%d", &b); printf("\n 입력하시는 사각형의 넓이는 \n %40d \n 입니다. \n", a*b); }
10. -10을 unsigned integer와 16진수로 나타내면 그 값은 얼마인가?
#include <stdio.h> void main() { int a = -10; printf("-10을 부호없는 정수형으로 출력했을 때의 값 : %u \n", a); printf("-10을 16진수로 출력했을 떄의 값 : %x \n", a); //결과값으로 이상한 값이 나오는데 이는 제대로 된 값이 아닌 쓰레기값이다. //이에 대해 제대로 이해하려면 -10이 메모리에 어떤식으로 저장되는지와 //저장된 값을 부호없는 정수형이나 16진수로 출력할 때 그 메모리를 어떤식으로 해석하는지에 대한 이해가 필요하다. //이 부분은 콘솔 환경을 넘어가서도 중요한 내용이니 기회가 될 떄 따로 정리를 해보도록 하겠다. }
10번 추가 설명 (19.06.16)
음수는 컴퓨터에 2의 보수 방식으로 저장된다. 즉, 8비트 환경에서 -10을 저장하면 1111 0110 으로 저장될 것이다.
(실제로는 32비트거나 64비트일 것이다.)
이를 부호없는 정수형으로 출력하면 앞의 128+64+32+16+4+2 = 이니 246이 된다.
(실제로는 더 큰 값이 나온다.)
이 값이 항상 일정하다는 보장이 있으면 어떤식으로든 쓸 수는 있겠지만 이 값은 컴퓨터 환경에 따라 다르게 될테니 쓸 수가 없다.
또한 16진수 표현은 음수표현은 고려되어 있지 않기 때문에 부호없는 정수형의 값인 246을 16진수로 표현한 값이 나온다.
프로그래밍할 때 중요한 내용은 아니고 그냥 메모리 저장에 대한 내용에 대한 이해가 중요한 부분.