블로그 이미지
송시혁

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

#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

 

각가의 바이트 크기에 따라 출력이 된다.

 

 

#include <stdio.h>
int main()
{
  int x, y;
  x=2;
  y = x + 5;
  
  //자료형의 경우
  printf("The size of int is %3d bytes.\n"sizeof (int));
  printf("The size of int is %3d bytes.\n"sizeof (short));
  printf("The size of int is %3d bytes.\n"sizeof (long));

  //변수의 경우
  printf("The size of x is %3d bytes.\n"sizeof x);

  //수식의 경우
  printf("The size of (x + 2) is %3d bytes.\n"sizeof (x + 2));
  return 0;
}

소스에서 sizeof x, sizeof (x +2) 가 있다. 이것을 주목하고 아래그림을 보자.

sizeof(int), sizeof(short), sizeof(long)는 제대로 4, 2, 4로 출력이 되었다.

그런데 sizeof(x), sizeof(x + 2)는 4바이트로 나온다. 위에서 x는 int x;라고 선언되어있다. 그래서

4바이트가 나온다. int니깐!!!! 당연히 char나 short로 선언하면, 다른 바이트의 크기가 출력된다.

이처럼 sizeof연산자는 각각의 자료형의 대한 바이트크기를 표현하는데 쓰인다.

 여기서 하나 더 언급하자면, 위의 수식의 경우 주목. 다른것은 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 inum = 23;
  short snum = 23;
  
  
  printf("The size of int 23 is %3d bytes.\n"sizeof(inum));
  printf("The size of int 23 is %3d bytes.\n"sizeof(snum));
  return 0;

}

  
 


 
  
  

 형수정자 - 타입을 수정하다

10진수 %d, 8진수%o, 16진수 %x를 아래소스를 보고 판단하자. 
  

#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>
int main()
{


printf("float %d\n", sizeof(float));
printf("double %d\n", sizeof(4.2)); //4.2는 double로 간주되어 8바이트



printf("long double %d\n", sizeof(long double));

return 0;
}

 

실수형 자료형인 double은 원래 sizeof를 써서 바이트 크기를 나타내면 위의 그림과 같이 8byte이다. 그러나 아래 그림과 같이 4.2뒤에 f를 붙여주면 얘기는 달라진다.

  
  
#include <stdio.h>
int main()
{  
  
  
  printf("float %d\n"sizeof(float));
  printf("double %d\n"sizeof(4.2f)); //4.2는 double로 간주되어 8바이트
                                       //   그러나 뒤에 f가 붙어서 4바이트.


  printf("long double %d\n"sizeof(long double));
  
  return 0;
}
 
  
  
  




#include <stdio.h>
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;
}

  
45000.671875가 45000.672로 표현되었다. 뒤에 875가 반올림 되었다는 소리인데, 9.4가 전체 9자리를 나타내고 소수점을 포함하여 4자리를 나타낸다. 45000.672

%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, 형수정자%c 아래그림에서 -1을 썼다.

#include <stdio.h>
int main()
{
unsigned int uiNumber;
uiNumber = -1;
printf("%d\n", uiNumber); // unsigned 인식못함.
printf("%u\n", uiNumber); // %u를 사용하여 제대로 출력.
return 0;
}

 

 

 

 

 

 
  

 

 


 

  
  

  
  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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를 출력하기 위한 프로그램다.

#include <stdio.h>
int main()
{
char cNumber;
cNumber = 'a';
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);
}

 

아래 그림과 같이  이것을 이런식으로 반복해서 소스를 짜면 알파벳 a~ z까지 만들 수 있다.

필자는 잘못복사하여 오류가 나서 시간관계상 z까지 못하였다. ㅜㅜ

#include <stdio.h>
int main()
{
char cNumber;
cNumber = 'a';
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);


printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);

cNmber = cNumber +1;
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);


printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);

cNumber = cNumber + 1;
printf("%d : %c\n", cNumber, cNumber);


return 0;
}

 

posted by 송시혁

 

0 0 0 0 0 0 0 0 8비트 = 1바이트(byte)

0이라는 한 자리에 숫자0,1 두가지만 들어간다.(2진수)

따라서 8자리이므로 2의 8제곱 = 256

1바이트 = 8비트

여기에 들어가는 숫자의 가지수는 256가지

숫자는 0~255까지 들어간다.

*숫자 수

37~65 = 29가지

0 ~ 100 = 101가지

1 ~ 100 = 100가지

계산방법 65 - 37 +1= 29이 나온다. 아래 것도 동일하게 나온다.

 

 토큰

C언어 문장 하나하나를 나눌 수 있는 최소단위

ex) #include <stdio.h>

int main()

{

plrintf("~", );

return 0;

}

파란색 하나하나가 토큰이다. 참고로 printf("~",);에서 printf , ( , ", 내용, ", ), ; 이 하나하나 토큰 더 이상 나눌 수 없는 최소단위이다.

변수조건

1.영어 (처음글자), _(shift + -키)

2.함수이름 사용못함 - printf문등은 함수이름이라 사용못함.

3.예약어 금지(if, else....)

4.띄어쓰기 ex) int num ber; -> 보기와 같이 num ber처럼 띄어쓰기를 하면 안된다.

반드시 붙여서  int number;라고 선언해야 한다.

5.name_$ -> 변수는 숫자와 영어만 쓸 수 있다.

변수와 상수

number = 3;

number = 4;

여기서 3, 4는 변하지 않는 수 즉, 상수라고 한다. 위에서 number는 3을 지정하면 3이고, 4로 지정하면 4가 된다. 그래서 변할 수 있는 수이기 때문에 변수이다.

상수 = constant value

constant

다음에 예를 들어보겠다

3 = 4; 상수에 상수를 3과 4 둘 다 상수이다.

상수를 상수로 대입하는것은 C문법에서든, 우리가 알고 있는 수학에서든 있을 수 없는 일

4 = 4;

일반적인 생각은 4 = 4 틀리지 않다.

그러나 C에서는 이것 또한 받아들이지 않는다.

다음은 이것을 프로그램 해서 출력한 화면이다.

 

 

 

일부러 4 = 4; 를 짰다. 물론 프린트문을 쓰지 않았지만, 컴파일 하면 다음과 같은 에러가 발생한다.

 

 

 

 

에러 메시지를 해석해보자

위의 Microsoft ~    

      Copyright  ~

이것은 신경쓰지 말자!!! 광고이다. Microsoft사에서 ㅅㅂ 쓸데없는 것 땜에 어렵게 해놨네.

그리고 그림 참조. 그림에서 동그라미1번은 '=' 표시이다. 이것을 해석하면 = 양쪽 옆에 이상이 있다라고 에러를 표시하는 것이다. 위에서 4 = 4;문이 틀렸다. 그리고 다음 잘 보면 왼쪽이 틀렸다고 빨간글로 써놨다. 즉 4 =4; 왼쪽인 4가 잘못되었다. 이것으로 이 문장에서는 변수로 4는 쓸 수 없다.

그리고 left operand  - 왼쪽 연산자. 이것 또한 에러의 위치를 알려주는 뜻.

 

 

 

자 이번에는 정수형의 종류인 char, short, int에 대해서 알아보다.

알아보기 전에 저번에 정리한 컴퓨터의 양의 정수 ,음의 정수, 부호비트와 보수법의 관계에 대해 생각해보자.

 

 

 

 

 

이 네모가 1바이트. 즉 8비트형, 정수형 char는 1바이트형 바이트.

 

 

short는 2바이트 8비트가 2개.

 

 

 

 

int 4바이트가 되겠다. 8비트가 4개.

위의 그림에서 255는 그대로 출력이 되는것을 알 수 있다. 255는 8비트 최대의 숫자이다.

그러니깐 1111 1111을 10진수로 바꾸면 255 그래서 1바이트는 255가 출력되고 나머지도 마찬가지로 당연히 그대로 출력된다. 그러면 그것보다 훨씬 큰 300을 넣겠다.

 

 

short와 int부분은 그대로 300이다. 위의 계산기를 잘보라. 1 0010 1100은 자리수가 9자리이다. (300의 2진수) 아홉자리이기 때문에 8자리를 넘는 제일 앞부분은 1은  char에서는 인식을 못하고 0010 1100만 10진수로 바꾸어 44가 출력되어 나온다. 아래에 short나 int는 각각 2바이트 16자리 4바이트 32자리이기 때문에 그대로 출력된다.

아래그림은 16자리 최대값인 1111 1111 1111  1111을 나타낸거임.

 

 

위와 마찬가지로 1바이트 char는 최대값 1111 1111만 출력되어 255!

 

65535보다 1더 큰 65536으로 해본 결과이다.

이번에는 16자리수를 넘어 17자리수로 가기때문에 short문 또한 0이 된다.

 

 

 

마찬가지 뒤에 10만 출력되어 2가 나왔다.

 

이번부터는 unsigned를 정의 하지 않고 프로그램을 해보겠다!!1

여기서부터 진짜~~~~~~~ 헤갈린다.

 

                       0                            127  128                                  255

 

 8비트는 0~ 255까지 표현된다. 그러나 이것을 절반으로 쪼개어 왼쪽으로 음수로 옮긴다.

 

 

 

     0                       127   128                   255

                                                                                                

위의 빨간줄 부분을 왼쪽으로 옮긴다.

 

 

                 128         129  130  131                 255  0      1  2   3                           255

                (-128)     -127  -126  (-125)          (-1)

이렇게된다. 이 그림을 이해하자 8비트에서 255가 -1이다.

 

자 그럼 아래 그림을 비교해보자.

 

 

 

 

위의 언급했듯이 unsigned를 쓴것이다.

그렇다면, 쓰지 않으면, 아래와 같은 그림이 된다.

 

 

 

위그림에서 출력값이 다르다라는것을 알 수 있다.

이것은 8비트에서는 0~255가 숫자범위이다. 하지만 위의 수평선 그려놓은 것을 잘봐라. 128~ 255는 -로 취급한다. 즉, unsigned를 썼을 때는 그냥 양의 정수로 출력이 된다. 이 unsinged는 양의 정수만 허용한다고 봐야한다.

그러나 unsigned를 허용하지 않을 때는 수평선대로-까지 고려한다. 따라서 0~127이넘는 숫자가 나올경우는 -로 출력이 되는 것이다.

 

 

 

 

이번엔 32자리.

 

 

 

posted by 송시혁
2013. 3. 6. 20:54 linux 연습

3단계 시작

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

나중에 창을 띄워 메시지가 보내지는지 테스트를 하는데 위의 그림 빨간 네모를 주목한다. 밑에도 아이디 trainer3는 자신의 번호이고, 나중에 메시지를 보내는 연습할 때 guset id에게 보내라고 지시를 내리는데 저기 pts/8을 잘 기억해야한다.

pts번호를 잘 기억해두자!!

 

 

 

 

 

 

 

여기서 guest의 pts를 확인 해라고 나온다. 그러나 실제로는 안 나올 수도 있다. 필자는 학원에서 사람들이 여러 명이 접속하였기에 나왔지만, 혼자서 하면 안 나올 때도 있다. 그럴 때는 그냥 넘어가면 된다.

 

 

이것을 잘 보고 아래에 시키는대로 접속하여야 한다.

 

 

 

 

새로운 프롬프트 창을 띄웠다. 윈도우즈 + r키를 눌러서 telnet 이라고 입력하면 된다.

 

띄어쓰기 엄청 중요하다!!! 이거 잘못하면 몇번이고 헤맨다. 나처럼ㅜㅜ...

enter키를 누르면 대화할 말을 쓰라고 하고 아무거나 쓰고 보내면 된다.

그러면 자신이 띄었던 새로운 프롬프트창에 뭔가의 메세지가 뜰것이다.

 

 

 

pts번호와 hm,hahaah, anybody there?, wall hi....등의 내용이 보인다. 이것도 학원에서 여러사람이 접속하여 나온것이다. 결국, 혼자서는 메세지를 확인 할 수 없다. 그러니 하는 방법만 암기하자!!!

3단계 끝

'linux 연습' 카테고리의 다른 글

linux 4단계  (0) 2013.05.16
윈도우7에서 telnet 접속 방법(보류)  (0) 2013.05.15
linux 2단계  (0) 2013.03.05
linux1단계  (0) 2013.03.04
posted by 송시혁