[변수에서 값의 구현 원리] 1Byte 8Bit 로 구성 1Bit는 0 , 1 로 표현 2Bit로 표현할수 있는 경우의 수 00 01 10 11 22 가지, 즉 4가지 경우의 수 발생 8Bit 의 경우 00000000 ~ 11111111 까지 이므로 28가지, 즉 65536가지의 수 발생 int M = 65; // 01000001 (실제로는 2진수로 변수에 담긴다.) 진법(2진수, 8진수, 16진수) 0 0 0 0 1 0 1 0 (10) MSB(Most Signed Bit) 최상위 부호비트 0: 양수 1: 음수 (단, sign형 기억장소 일때)
10진수 변환시 [1방법] = 0*20 + 1*21 + 0*22 + 1*23 + 0*24 + 0*25 + 0*26 결과: 10 마지막 27자리는 MSB이므로 계산의 대상에서 제외된다. [2 방법] = 0*1 + 1*2 + 0*4 + 1*8 + 0*16 + 0*32 + 0*64 [3 방법] = 1*2 + 1* 8 [4 방법] = 2+8 [진법 및 sign, unsigned 형 변수의 완벽해부] *********** 2진수 ************(1Byte) 0 0 0 0 1 0 1 0 (10) 0 0 0 0 1 0 1 0 MSB(Most Sign Bit) 최상위 부호비트 0: 양수 : 00001010 (+10) 1: 음수 : 11110101 (-11) 20 자리 21 자리 22 자리 23 자리 24 자리 25 자리 26 자리 27 자리
MSB 64 32 16 8 4 2 1 (가중치) 0 0 0 0 1 0 1 0 (2진수) MSB 64 32 16 8 4 2 1 (가중치) 0 1 0 1 1 0 1 0 (2진수) = 64 + 16 + 8 + 2 + 1 ( 91 ) MSB 64 32 16 8 4 2 1 (가중치) 0 0 1 1 0 1 0 0 (2진수) = 32 + 16 + 4 ( 52 )
[16진수] 10 11 12 13 14 15 (10진수로 볼때) 0 1 2 3 4 5 6 7 8 9 A B C D E F 2진수 네자리는 16진수 한자리 (16진수 1자리 2진수 4자리) 2진수 세자리는 8진수 한자리( 8진수 1자리 2진수 3자리) 0 0 0 1 0 0 1 1 ( 19 ) 0x13 (16진수) 0 0 0 1 0 0 1 1 ( 19 ) 023 ( 8진수) ex) 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 0
[진법간 상호 변환] 0x23 0010 0011 0x79 0111 1001 035 00 011 101 036 00 011 110 043 0x75 076 046 [컴퓨터의 음수 표현] 2의 보수법 ( 2’s Complement ) 00001010 ( +10 ) 11110101 ( 1의 보수법으로 변환 ) 11110110 ( 위의 수에 1을 더한다) ( -10 ) MSB
[양수일경우] MSB 64 32 16 8 4 2 1 (가중치) 0 0 0 0 1 0 1 0 (2진수) = 8 + 2 결과: +10
28가지 256가지 양수 128 가지( 0 ~ 127 ) 음수 128 가지( -1 ~ -128 ) 1 1 1 0 0 1 0 1 : -( 16 + 8 + 2 + 1 ) 결과: -27 1 1 0 1 0 1 0 1 : -( 32 + 8 + 2 + 1 ) 결과: -43 문 1) -22를 2진수로 표현 하시오. 힌트: 1 과 0 을 바꾸어서 21 을 만든다. 1 1 1 0 1 0 1 0 : - (16 + 4 + 1 + 1) [ 1Byte 기억장소가 기억할수 있는 값의 범위 ] 01111111 (127) : 00000010 ( 2 ) 00000001 ( 1 ) 00000000 ( 0 ) 11111111 ( -1 ) 11111110 ( -2 ) 11111101 ( -3 ) 11111100 ( -4 ) : 10000000 ( -128 ) 28가지 256가지 양수 128 가지( 0 ~ 127 ) 음수 128 가지( -1 ~ -128 )
[signed 형과 unsigned 형 기억장소] signed 형일경우) 0 0 1 0 0 0 0 1 ( +33 ) 1 1 1 1 1 0 0 0 ( - 8 ) unsigned 형일경우) : 첫번째 비트는 MSB 가 아니다. 즉, 음수가 없다. 0 0 1 0 0 0 0 1 ( +33 ) 1 1 1 1 1 0 0 0 ( +248 ) char a = 128; // 10000000 (-128) // 첫 비트를 MSB로 인식 unsigned char a = 128; // 10000000 // 첫 비트를 MSB로 인식하지 않음
1. 자료형 2. 상수 3. 변수 a. 정수형 자료형 종 류 크기(byte) 표현가능수 값의 범위 char 1 28 -128 ~ 127 unsigned char 0 ~ 255 int 2 또는 4 short 2 216 -32768 ~ 32767 long 4 232 -2147483648 ~ 2147483647 unsigned int unsigned short 0 ~ 65535 unsigned long 0 ~ 4294067295 int 또는 unsigned int 는 16bit 운영체제에서는 2byte공간이 확보되고 32bit 운영체제나 대형서버 기종에서는 4byte공간이 확보된다.
b. 실수형 자료형 종 류 크기(byte) 값의 범위 float 4 약 –10-38 ~ +10+38 double 8 종 류 크기(byte) 값의 범위 float 4 약 –10-38 ~ +10+38 double 8 약 –10-308 ~ +10+308 [자료형 예제] int kor; // 2 byte char hak; // 1 byte double avg; // 8 byte char su = 280; // 가능한가? // -128 ~ 127 long suja = 3948389;
[출력함수] C언어는 문장(statement)이라는 것을 이용하지 않고 함수(function)라는 것을 이 용해 입출력을 수행한다. [ printf 함수 ] 형식) 1. printf(“ 출력메시지”); 2. printf(“ 출력서식”); 3. printf(“ 출력메시지 및 출력서식”, 출력대상체...); 1. 사용예 printf(“ Hello !”); printf(“안녕하세요?”); printf(“ 박상훈은 잘 생겼다.”); printf(“ 상훈이와 철수 는 밤새도록 공부를 열심히 하였다.”); (줄을 바꾸어 출력하고자 할경우) printf(“상훈이는 C언어에 \n미쳤다.”); 2. 사용예 printf(“ %d ”, 25); printf(“ %f ”, 45.43); printf(“ %c ”, ‘A’); printf(“ %ld ”, 34567430); printf(“ %s ”, “이한 디지털리”); int kor = 97; printf(“ %d ”, kor );
3. 사용예 printf(“ 철수의 나이는 %d 살 이고 \n영희의 나이는 %d 살 입니다.”, 9, 8 ); [결과] 철수의 나이는 9살 이고 영희의 나이는 8살 입니다. printf(“ 여기에 있는 사과의 종류는 %s 이고, \n갯수는 %d 개 입니다.” , “홍옥”, 4 ); [결과] 여기에 있는 사과의 종류는 홍옥이고, 갯수는 4개 입니다. [예제] #include<stdio.h> void main() { int kor = 97; printf(“국어 점수는 %d입니다.”, kor ); }
[상수] 상수란. : 변할수 없는 고유한 크기를 갖는 수 상수의 종류 1 [상수] 상수란? : 변할수 없는 고유한 크기를 갖는 수 상수의 종류 1. 정수상수 정수는 일반적으로 메모리상에 2byte로 표현 된다. 4byte로 표현하여 사용 하고자 할 경우에는 숫자 뒤에 L 자를 붙히면 된다. 예) 43L 8진수는 숫자 앞에 0(zero) 을 붙히고, 16진수는 숫자앞에 0x를 붙힌다. ( 십진수: 34 8진수: 023 16진수: 0x3A ) 상수종류, 의 미 표 현 정수상수 소숫점이 없는수 32, 156, 0, 23L, 0x3a, 021 실수상수 소수점이나 지수를 가진수 21.32, 0.012, 21.3E+01, 76.2F 문자상수 ‘ ‘ 안에 표현 되는 1byte 수 ‘A’, ‘M’, ‘b’, ‘\n’, ‘\t’ 문자열상수 “ “ 안에 표현되는 2byte 이상의 수 “KBS”, “mbc”, “박상훈”, “a” 나열형상수 사용자가 임의로 만든 수 NAME, PRICE, PCT 주소상수 메모리 상의 임의의 위치 값 ‘\0’, (char *)0xfb31
[정수 출력 서식] printf() 과 같은 함수를 이용하여 정수를 출력하기 위해서는 다음과 같은 출력서식을 사용한다. 출 력 범 위 출력크기 결과값 %d -32768 ~ 32767 2 byte 범위의 data 출력용 10진수 %o ″ 8진수 %x 16진수 %u 0 ~ 65535 (주소 표현시 사용) %ld -21474836 ~ 21474837 4 byte 범위의 data 출력용 %lo %lx %lu 0 ~ 4294967295 [Tip] 우리는 어떤 data 를 어떻게 출력 하느냐에 따라 적절한 출력 서식을 선택 해야만 한다. 위의 내용은 다소 중요한 내용이므로 외워두자!
//출력서식 예제1 #include<stdio.h> void main() { printf(“ %d\n”, -23); printf(“ %ld\n”, -231); printf(“ %d\n”, 765474); printf(“ %u\n”, -23); printf(“ %lu\n”, -2332); printf(“ %ld\n”, 7800000); } // 출력 범위에 맞지 않으면 쓰레기 값이 출력된다. 2. 실수상수 실수는 일반적으로 메모리상에 8byte로 표현 된다. 4byte로 표현 하고자 할경우에는 뒤에 F자를 붙힌다. 예) 23.5F 출력서식 출력내용 출력 예 %f 소숫점 이하 6자리 까지 출력한다. 34.600000 , 0.012000 %e 지수 형태로 출력한다. 2.230000e+01 %g 일반적인 형태로 출력한다. 23.543
printf( “%f “, 21.8 ); 결과: 21.800000 printf( “%f “, 0.023 ); 결과: 0.023000 printf( “%f “, 532.145 ); 결과: 532.145000 printf( “%f “, 0.1235478 ); 결과: 0.123548 (소숫점 이하 7자리에서 반올림) printf( “%e ”, 21.8 ); 결과: 2.180000e+01 printf( “%e “, 0.023 ); 결과: 2.300000e-02 printf( “%e “, 532.145 ); 결과: 5.321450e+02 printf( “%e “, 0.12354788 ); 결과: 1.235479e-01 (7자리에서 반올림) printf( “%g ”, 21.8 ); 결과: 21.8 printf( “%g “, 0.023 ); 결과: 0.023 printf( “%g “, 532.145 ); 결과: 532.145
3. 문자형 상수 ‘ ‘안에 기재하는 1byte문자 문자상수를 표현할때는 2btye공간을 필요로 하지만 기억장소에 저장이 될때는 하위 1byte 만 저장이 되어진다. ( 따라서 1byte 정수와 구별이 되지 않는다.) 제어문자(하드웨어 적인 기능을 수행 하는 문자)를 포함한다. ‘\n’ : 커서나 파일 포인터를 다음행 동일열로 이동 시킨다. ‘\a’ : 스피커를 통해 “삑” 소리를 나게 한다. ‘\r’ : 커서나 파일 포인터를 동일행 첫열로 이동 시킨다. ‘\f’ : 프린터 용지를 한장 넘긴다. ‘\b’ : 커서나 파일 포인터를 동일행 이전 열로 이동 시킨다. ‘\t’ : 커서나 파일 포인터를 동일행에서 일정한 칸만큼 이동 시킨다. 출력서식 으로는 %c 를 이용하여 출력한다. #include<stdio.h> void main() { printf(“%c”, ‘A’); printf(“%c”, ‘\n’); printf(“%c”, ‘B’); printf(“%c”, 65); printf(“%c”, 97); } [출력결과] A BAa
4. 문자열 상수 따옴표(“ “)안에 사용하는 문자 문자열상수는 실제 표현되어 있는 글자수 보다 1byte더 크게 메모리에 표현된다. 모든 문자열 뒤에는 NULL(널)값이 붙어 있다. 출력서식으로는 %s를 사용한다. #include<stdio.h> void main() { printf(“%d”, sizeof( “korea”) ); printf(“%d”, sizeof(“english”) ); printf(“%d”, sizeof( “japan”) ); printf(“%d”, sizeof(int) ); printf(“%d”, sizeof(double) ); printf(“%d”, sizeof(27) ); printf(“%d”, sizeof(2.45) ); } #include<stdio.h> void main() { printf(“%s\n”, “korea”); printf(“%s\n”, “english”); printf(“%s\n”, “japan”); } sizeof( ) 연산자란? 괄호안에 자료형, 변수, 값 등을 넣을수 있으며 괄호안에 있는 것이 메모리에 표현될때 해당 byte수를 발생한다.
#include<stdio.h> void main() { printf( “MBC\n”); printf( “MBC+1\n”); printf( “MBC+2\n”); } [처리결과] MBC MBC+1 MBC+2 #include<stdio.h> void main() { printf(“%s\n”, “MBC”); printf(“%s\n”, “MBC”+1); printf(“%s\n”, “MBC”+2); } [처리결과] MBC BC C
[문자열 상수가 메모리에 표현 되는 방법] C언어에서 모든 문자열은 자기 자신의 주소로 간주된다 [문자열 상수가 메모리에 표현 되는 방법] C언어에서 모든 문자열은 자기 자신의 주소로 간주된다. 따라서 “박상훈” 이란 문자열이 몇번지쯤에 있는지를 알고 싶으면 “박상훈”이란 번지를 출력해 보면 된다. 그리고 %s라는 출력서식 또한 해당 번지부터 시작해서 널값 전까지 출력하라는 뜻이므로 “MBC”번지 부터 널값 전까지 출력한다. ‘M’ ‘B’ ‘C’ ‘\0’ “MBC”+3 번지 “MBC”+2 번지 “MBC”+1 번지 “MBC” 번지
5. 나열형 상수 사용자가 임의로 숫자를 만들어 사용하는 방법으로 컴파일러와의 약속에 의 해 구현될수 있다 5. 나열형 상수 사용자가 임의로 숫자를 만들어 사용하는 방법으로 컴파일러와의 약속에 의 해 구현될수 있다. 정수와 완전히 동일하게 사용된다. 예) enum COLOR{BLACK, BLUE, GREEN, MAZENTA}; 이름 0 1 2 3 문자를 숫자처럼 사용하는 방법이다. 초기값이 지정되면 해당값을 사용하며 이후의 문자들은 무조건 앞의 숫자에 1을 더한 값을 사용하게 된다. #include<stdio.h> void main() { enum COLOR{BLACK, BLUE = 4, RED, HHH = 7, FFF }; int su = BLACK + BLUE; printf(“ %d “, su); printf(“ %d “, RED + FFF ); }
3. 변수 변수는 상수값을 기억 시키기 위한 메모리의 일정 공간을 의미한다 3. 변수 변수는 상수값을 기억 시키기 위한 메모리의 일정 공간을 의미한다. 종류: 정수변수, 실수변수, 문자변수, 나열형변수, 주소변수 등이 있다. 3.1 문자변수 기억장소를 1byte로 확보한다. char, unsigned char 예약어를 사용하여 변수를 준비한다. char M; unsigned char N; 3.2 정수변수 자료형에 따라 기억장소의 크기가 결정된다. short, int, unsigned short, unsigned int : 2byte long, unsigned long : 4byte 3.3 실수변수 float(4), double(8) 의 크기로 기억장소가 확보된다. 3.4 나열형 변수 나열형 상수를 대입할때 사용이 된다. 정수변수와 동일하게 취급된다. enum NAT{ONE, TWO, THREE}; enum NAT var = TWO;
[자동형 변환과 강제형 변환] a. 자동형 변환 연산이나 대입시에 자료형이 자동적으로 바뀌어서 처리되는 것을 말한다 [자동형 변환과 강제형 변환] a. 자동형 변환 연산이나 대입시에 자료형이 자동적으로 바뀌어서 처리되는 것을 말한다. 연산이나 대입시 자료형이 작은쪽에서 큰쪽으로 자료형 변환이 발생한다. 크기 char -> unsigned char -> short -> unsigned short -> int -> unsigned int -> long -> unsigned long -> float -> double 예) ‘A’ + 3 일경우 ‘A’는 char형이고 3은 int 형이므로 char형이 int 형으로 변환되어 연산이 발생한다. 연산의 결과는 int 형이 발생한다. #include<stdio.h> void main() { int M, N; printf(“%f”, 2.4 + 1.2); M = 2.4 + 1.2; printf(“%d,%f”, M, 3.65+2); }
a. 강제형 변환 사용자가 강제적으로 형변환을 유도하는 것을 말한다. 이때 사용되는 연산자를 cast 연산자라 한다 a. 강제형 변환 사용자가 강제적으로 형변환을 유도하는 것을 말한다. 이때 사용되는 연산자를 cast 연산자라 한다. 예) int M = 2.3 + (int)6.9; int A = (int)( 2.1 + 9.2 ); printf(“%d”, (int)(2.4+2) ); int Tot = (90+100+90)/3; #include<stdio.h> void main() { int M; double N; printf(“%d”, (int)(2.4 + 1.2) ); N = 2.4 + 1.2; printf(“%d,%d”, M, (int) N ); }