대입 과정의 형 변환
형 변환
– 정수를 실수형 변수에 넣는 것은 문제 없지만,
– 실수를 정수형 변수에 넣는 것은 자료의 손실이 생긴다. 컴파일 에서 경고한다.
오버플로(overflow)는 경고하지 않는다.
강C프로그래밍 1
char c;
C = 10000; char = int (자료 손실. 경고)
C = 100 + 100; char = char + char (오버플로. 경고 없 음)
명시적 형 변환
명시적 형 변환(explicit type conversion)
– 개발자가 의도적으로 자료의 형을 변환하는 것
변수 또는 상수 앞에 (자료형)을 넣는다.
– value = (float) 10; // 상수 10을 float 형 10.0으로 변 환한다.
(int)로의 형 변환은 소수점 이하를 제거하고, (float)으로 의 형 변환은 경고를 없앤다.
– 반올림은? 강C프로그래밍 2
int i ;
double f = 10.0;
i = f; // 컴파일시에 경고가 나온다.
i = (int) f; // 경고 없이 컴파일된다.
명시적 형 변환
결과값을 예측하자.
강C프로그래밍 3
#include <stdio.h>
int main(void) {
printf("(1) %d 입니다.\n", 7 / 3);
printf("(2) %d 입니다.\n", 7 / 3.0);
printf("(3) %f 입니다.\n", 7 / 3);
printf("(4) %f 입니다.\n", 7 / 3.0);
printf("(5) %d 입니다.\n", 7 / (double)3);
printf("(6) %f 입니다.\n", (double)7 / 3);
printf("(7) %f 입니다.\n", (int)7 / 3.0);
printf("(8) %f 입니다.\n", 7 / (int)3.0);
}
명시적 형 변환
강C프로그래밍 4
#include <stdio.h>
int main(void) {
printf("(1) %d 입니다.\n", 7 / 3);
printf("(2) %d 입니다.\n", 7 / (int) 3.0);
printf("(3) %f 입니다.\n", (double)7 / 3);
printf("(4) %f 입니다.\n", 7 / 3.0);
printf("(5) %d 입니다.\n", (int) (7 / (double)3));
printf("(6) %f 입니다.\n", (double)7 / 3);
printf("(7) %f 입니다.\n", (int)7 / 3.0);
printf("(8) %f 입니다.\n", 7 / (double) (int)3.0);
}
5.4 관계, 논리, 비트 연산자
5 강C프로그래밍
관계 연산자
크다, 작다, 같다의 관계를 판단
관계연산자도 값을 반환한다.
– 맞으면 1 (True의 의미) – 틀리면 0 (False의 의미)
강C프로그래밍 6
컴퓨터에서 0은 FALSE, 1 또는 0이 아닌 모든 수는 TRUE 이다.
연산자 의미 사용법
> 왼쪽이 더 크다 a > b
< 오른쪽이 더 크다 a < b
>= 왼쪽이 더 크거나 같다 a >= b
<= 오른쪽이 더 크거나 같다. a <= b
== 같다 a == b
!= 다르다 a != b
비교
사용 예
– result = 3 > 2 ; // result 에 1(True)이 들어간다.
– result = value <= 100; // value의 값에 따라 0 또는 1이 들어 간다.
잘못된 사용
– result = -3 < value < 0 ; (문법상 에러는 아니지만, 의도와 다 르다)
– result = ( -3 < value ) < 0; 으로 해석되기 때문
강C프로그래밍 7
관계 연산자를 하나의 수식에 여러 개를 쓰는 것은 좋지 않다.
동등
같다 (==)
– 양쪽의 피연산자의 값이 같으면 1(True), 다르면 0(False) 반환 – a == b (변수 a 와 b의 값이 같은가)
– a == 1 (변수 a의 값이 1인가)
다르다 (!=)
– 양쪽의 피연산자의 값이 다르면 1(True), 같으면 0(False) 반환
강C프로그래밍 8
a=1, b=2, c=3일때
ret = (a < b) == (b < c) 에서 ret 의 값은?
관계 연산자와 관련된 실수들
>= 는 있지만 =>는 없다.
!=는 있지만 < >는 없다.
!는 반대라는 의미로 논리연산자에서도 사용된다.
! =, > =, = = 와 같이 공백이 들어가면 안 된다.
==와 =는 다르다. 잘못 쓰더라도 에러가 나지 않는다.
강C프로그래밍 9
논리 연산자
옳다, 그르다의 판단을 하는 연산자
– 피연산자 역시 옳다(True), 그르다(False) 값이 들어간다.
&&, ||, ! 의 세가지가 있다.
– ||는 ‘Shift-\’ 세로막대기(horizontal bar)이다.
주로 조건문(6장 참조)에 사용된다.
강C프로그래밍 10
&& || !
True && True -> True True || True -> True ! True -> False True && False -> False False|| True -> True ! False -> True False && True -> False True || False -> True
False && False -> False False || False -> False
논리 연산자
Result = number > 10 || number < 5;
– number 값이 10보다 크거나 또는 5보다 작으면 Result에 True
Result = score || set
– Result = (score != 0) || (set != 0 ); 0은 False, !0 은 True
의미 없는 수식이 되지 않도록 유의한다.
– Result = number > 10 && number < 5 ;
괄호를 이용하면 이해하기 쉽다.
– Result = (number > 10) || (number < 5);
강C프로그래밍 11
비트 연산자
2진수의 각 비트별 연산
시스템 프로그램, 하드웨어 제어에 주로 이용
예)
강C프로그래밍 12
c = 3 & 5;
0 0 1 1 (3) 0 1 0 1 (5) --- --
0 0 0 1 (1) c = 1
c = 3 | 5;
0 0 1 1 (3) 0 1 0 1 (5) --- --
0 1 1 1 (7) c = 7
c = 3 ^ 5;
0 0 1 1 (3) 0 1 0 1 (5) --- --
0 1 1 0 (6) c = 6
c = ~3 ; 0 0 1 1 (3) ---
1 1 0 0 (12)
c = 12 또는 - 4
* 편의상 4비트라 가정
& (AND)
0 & 0 -> 0 0 & 1 -> 0 1 & 0 -> 0 1 & 1 -> 1
| (OR) 0 | 0 -> 0 0 | 1 -> 1 1 | 0 -> 1 1 | 1 -> 1
^ (XOR) 0 ^ 0 -> 0 0 ^ 1 -> 1 1 ^ 0 -> 1 1 ^ 1 -> 0
~ (1의보수) 0 -> 1 1 -> 0
비트 연산자
Shift 연산자 << >>
– a << b : a의 값을 왼쪽으로 b 비트 만큼 이동 – a >> b : a의 값을 오른쪽으로 b 비트 만큼 이동
– << 1 는 2를 곱한 효과가, >> 1은 2로 나눈 효과가 있다.
강C프로그래밍 13
c = 2 << 3;
0 0 0 0 0 0 1 0 (2)
0 0 0 0 0 1 0 0 (2 << 1 ->
4 )
0 0 0 0 1 0 0 0 (2 << 2 ->
8 )
0 0 0 1 0 0 0 0 (2 << 3 ->
16 ) c = 16
c = 18 >> 2;
0 0 0 1 0 0 1 0 (18)
0 0 0 0 1 0 0 1 (18 >> 1 ->
9 )
0 0 0 0 0 1 0 0 (18 >> 2 ->
4 )
c = 4
비트 연산자의 활용
변수와 LED가 연결되어 있을 때,
강C프로그래밍 14
char c;
0 0 0 0 0 0 0 07 6 5 4 3 2 1 0
bit LED
오른쪽 3번째 불 켜기
c = c | 4;
전체 불 다 켜기
c = ~ 0 ;
켜진 불을 왼쪽으로 2 칸 이동하기
c = c << 2 ;
켜진 불은 끄고 꺼진 불은 켜기
c = ~ c;
가장 오른쪽 불이 켜 져 있는지 확인하기 onoff = c & 1 ; 왼쪽 4개의 불 끄기
c = c & 0x0f ;
연산자 우선순위
강C프로그래밍 15
연산자 (높은 순서) 설명
++ -- (후치) 증감 연산자
++ -- (전치),
! ~ + -
증감 연산자 단항 연산자
* / % 산술 연산자
+ - 산술 연산자
<< >> 비트 연산자
< <= >= > 관계 연산자
== != 관계 연산자
& ^ | 비트 연산자
&& || 논리 연산자
= += -= *= /= %= &= ^= 대입 연산자
연산자 우선순위는 문장 해석에서 중요한 역할을 담당한다.