3월 8일 형수정자 연산자 sizeof
#include <stdio.h>
int main()
{
int num;
num = 2147483647;
num = num + 2;
printf("양의 최대값보다 + 2가 큰 값은 %d.\n", num);
num = num - 2;
printf(" 양의 최대값 %d.\n", num);
return 0;
}
실행 출력값이 -2147483647 첫번째 줄
2147183647 두번째 줄로 출력된다.
정수 자료형인 int에 최대값은 0에서 429496729775이다.
이것을 반으로 나누어 정수로 생각했을 때는 양의 정수 0~ 2147483645
음의 정수 2147183648 ~ 4294967295이다.
수직선이 있다 생각하고 음수를 나열하면 제일 왼쪽 끝에서
2147183648/ 2147183649 / 2147183650....등으로 나열된다. 이것은
(-2147183648) (-2147183647) (-2147183646) 이된다.
따라서 2147183647이가 num = num +2;에서 숫자로는 2147183649가 된다
음수로 -2147183647 이된다. 그리고 밑에 프린트문은 다시 -2를 하니 되돌아 온다.
scanf 프로그램
scanf는 키보드로부터 데이터를 입력을 받기 위한 함수.
scanf 형식
scanf("내용", 여기까지는 printf문과 동일.(단, 대행문자 \n은 쓰면 안됨.)
, 뒤에 &과 변수가 붙는다. & (and, 앤 퍼세트(%)라고 읽는다.)
scanf("내용", & 변수나 상수); 이것이 scanf의 형식
아래 소스를 보자.
#include <stdio.h>
int main()
{
int number; // number 변수 지정
printf("Please enter a number :"); // 아래화면 내용 참고
scanf("%d", &number); // 정수를 입력하기 위해 %d를 사용.
printf("The number you typed is %d.\n", number); //최종화면 출력.
return 0;
}
출력화면은 100을 입력하자 그대로 100이 나오도록 되어있다. 처음에 실행시키면 , 아무것도 안뜨다가 100을 입력하면 Please enter a number : 100이 뜬다.
#include <stdio.h>
int main()
{
int number;
printf("Please enter a number :");
scanf("%d", &number);
printf("The number you typed is %x.\n", number);
return 0;
}
이번에는 프린트문에 %x를 썼다. scanf에서는 정수로 키보드를 치지만, 마지막 출력화면에는 16진수로 받는 형태의 소스이다. 10진수를 16진수로 빨리 알고 싶다면 유용한 소스이다. 이 방법으로 계산기를 만든다. ㄷㄷ;(어렵다 ㅜㅜ)
연산자 sizeof
sizeof는 printf, scanf와 비슷하게 생겨서 함수라고 착각할 수 있지만, 연산자이다. 다음 소스를 보면서 sizeof를 이해하자.
#include <stdio.h>
int main()
{
printf("char의 크기는 %dbyte입니다.\n", sizeof(char));
printf("short의 크기는 %dbyte입니다.\n", sizeof(short));
printf("int의 크기는 %dbyte입니다.\n", sizeof(int));
printf("long의 크기는 %dbyte입니다.\n", sizeof(long));
return 0;
}
저번시간에 배웠던 자료형인 char, short, int 그리고 long이 추가되었다. 자료형의 바이트크기는 CPU에 따라 조금씩 다르다. 어쨌든 내가 배우는 프로그램에서는 각각 1, 2, 4, 4의 바이트의 크기를 갖는다.
char ≤ short ≤ int ≤ long
1 2 4 4
각가의 바이트 크기에 따라 출력이 된다.
|
여기서 하나 더 언급하자면, 위의 수식의 경우 주목. 다른것은 sizeof다음에 ()가 있는데 변수를 적을 때는 ()없는 것을 알 수 있다. 저것을 주목하고 오류없이 구성해야 한다.
아래소스들은 참고.
#include <stdio.h>
int main()
{
unsigned int num1 = 67U;
unsigned long int num2 = 89UL;
printf("5%d: size of 67U is %3d byte\n", num1, sizeof(67U));
printf("5%d: size of 89UL is %3d byte\n", num2, sizeof(89UL));
return 0;
}
#include <stdio.h>
|
|
|
int main()
{
int number = 67; .// 일단 number를 67로 선언. 67의 각각 다른 진수로서 출력.
//10진수, 8진수 , 16진수로 출력
printf("The value of 67 in decimal is %3d.\n", number);
printf("The value of 67 in octal is %3o.\n", number);
printf("The value of 67 in hexa decimal is %3x.\n", number);
// 8진수와 16진수를 10진수로 화면에 출력
printf("The decimal value of 020 & 0x20 is %5d & %3d.\n", 020,0x20);
return 0;
}

10진수 당연히 그대로
8진수 103
16진수 43
위의 마지막 프린트문에서는 8진수 20과 16진수 20을 각각의 10진수로 나타낸 프린트문. 바꾸고자하는 숫자앞에 숫자0을 붙이면, 8진수가 되고 0x는 16진수가 된다.
|
실수형을 sizeof연산자를 써서 이해하기.
#include <stdio.h> |
실수형 자료형인 double은 원래 sizeof를 써서 바이트 크기를 나타내면 위의 그림과 같이 8byte이다. 그러나 아래 그림과 같이 4.2뒤에 f를 붙여주면 얘기는 달라진다.
|
#include <stdio.h> |
|
#include <stdio.h>
45000.671875가 45000.672로 표현되었다. 뒤에 875가 반올림 되었다는 소리인데, 9.4가 전체 9자리를 나타내고 소수점을 포함하여 4자리를 나타낸다. 45000.672
int main()
{
float fnumber = 45000.67;
printf("%f\n", fnumber);
printf("%9.4f\n", fnumber); // 9자리 소수포함하여 나타내고
printf("%e\n",fnumber); // 소수점 앞쪽으로 4칸이동.
printf("[%3d]\n", 7);
printf("[%-3d]\n", 7);
return 0;
}
%e = 45000.671875에서 소수점을 ???(잘몰라서 나중에 올리겠음)
[%3d] = 오른쪽으로 3번째 위치 = [_ _ 7]
[-%3d] = 왼쪽으로 3번째 위치 = [7--]
다음은 아래소스를 통해서 %d와 %u를 알아본다.
#include <stdio.h>
int main()
{
unsigned int uiNumber;
uiNumber = -ffffffff;
printf("%d\n", uiNumber); // unsigned 인식못함.
printf("%u\n", uiNumber); // %u를 사용하여 제대로 출력.
return 0;
}
위의 예제에선 unsigned int로 자료가 저장 되었더라도 출력형식을 이에 맞춰 %u로 하지 않으면 잘못된 결과를 낼 수 있다는 것을 확인 할 수 있다.
%u는 unsigned int라는 뜻이다 %d가 -ffffffff를 인식하지 못하고 signed int 출력화면에 나타낸다.
|
|
TIP
short A; 변수를 선언했다 가정.
A = -1이라고 선언하면 short의 최대범위 숫자가 나온다. 이것은 저번에 배운 보수법과 부호비트를 이해하면 알 수 있다. 나머지 int, long, char또한 마찬가지이다.
|
|
|
char = 문자상수. 그러나 따지고 보면 정수. 그이유는 아래소스와 출력을 참고하자.
#include <stdio.h>
int main()
{
char cNumber;
cNumber = 'z'; //문자상수(숫자), z의 폰트번호 122
printf("%d\n", cNumber);
printf("%c\n", 122);
printf("%c%c%c\n", 122, 32 ,122);
return 0;
}
출력화면은 없지만, 대강 출력화면에 나타나는 수는
122
z, ...., z가 나온다. 이것은 ,ASCII코드에서 z가 122이기 때문이다.
도스화면에서 alt키를 누른 상태로 122번을 입력하고 손을 떼면
실제로 z가 나온다. 이것 때문에 사실상 char는 정수라고 생각한다.
다시 말하면, 컴퓨터의 문자는 ASCII코드 숫자와 연결이 되어있다.
아래그림은 문자 a 와 b를 출력하기 위한 프로그램다.
필자는 잘못복사하여 오류가 나서 시간관계상 z까지 못하였다. ㅜㅜ
|