본문으로 바로가기
반응형

캐스트(cast) 연산자

 산술연산의 경우 int + float와 같이 두 피연산자의 자료형이 다를때 시스템이 자동적으로 int형은 float형으로 변환시킨 다음, 덧셈 연산을 수행한다. 캐스트 연산자는 프로그램내에서 명시적으로 자료형을 변환시킨다.

 

 3 + 3.14 를 수행할때, int + float형의 덧셈연산인데, 이를 자동으로 3.0 + 3.14로 변환시켜서 연산을 수행한다. 이를 묵시적 형변환이라 한다.

 

사용방법은    (자료형) 수식     을 사용해주면 된다.

뜻은 수식의 결과값을 괄호 속의 자료형으로 바꾸라는 의미이다. 이를 명시적 형변환이라고 한다.

 

x를 long형, y를 int형 변수라고 할 때, 다음의 명령문에서 캐스트 연산자는 y의 값을 먼저 long형으로 바꾼 다음 4를 더하여 그 값을 x에 부여하라는 의미이다.

x = (long)y + 4;

 

// 자동 형변환 예제
#include <stdio.h>

int main() {
	int n = 24.5;
	double d = 3;
	char c = 129;

	printf("%d, %f, %c \n", n, d, c);
	return 0;
}

 

 char c = 129;   로 선언했을때 출력값이 ?로 되있는 것을 볼 수 있는데, 아스키 코드 129를 출력하게되는데 값이 깨져서 ?로 출력되는 것이다.

 

만약 아스키코드로 65는 A인 char값을 출력해본다면 다음과 같이 출력된다.

 

 

 

// 명시적 형변환 예제
#include <stdio.h>

int main() {
    double time = 0.375;
	int min;
	printf("0.375는 몇 분, 몇 초 인가? \n");
	time = time * 60;   // 분 단위로 환산
	min = (int)time;    // 정수값만 추려서 min에 저장
	time = time - min;  // time에는 분 단위 값만 남는다.

	printf("분 : %d \n", min);
	printf("초 : %d \n", (int)(time * 60));
	return 0;
}

 

 double형 값을 int형으로 형변환해서 출력하면 소숫점값들을 소실된다. 컴퓨터 연산에서는 반올림에대한 연산이 없기때문에 반올림연산을 수행하려면 0.5를 항상 더해주고 int형으로 출력하면 된다.

 

 

 

비트연산자

 비트는 정보를 관리하는 가장 작은 단위이다. 보통 비트는 1과 0으로 표현된다. 비트연산은 주로 H/W 관련 프로그래밍에서 사용되지만, 그 이외의 프로그래밍 분야에서도 유용하게 사용될 수 있다. 적절히 사용하여 요구되는 메모리 공간을 줄이고 성능을 향상시키는 요인이 되게 할 수 있기 때문이다.

 

이 연산자들은 정수나 문자 데이터 타입에 동작한다.

 

비트논리연산자

 피연산자 정수값을 비트 단위로 논리 연산을 구행하는 연산자이다. AND(&), OR(|), XOR(^), NOT(~)의 기본 논리식에 의해 이루어 진다.

 

 비트 단위 AND(& : bitwise AND) 연산자

  & 연산은 두 개의 비트를 비교하여, 모두 1이면 1을 반환하는 연산이다.

  2개의 8비트 변수(char)가 AND(&)가 될 때 AND(&) 연산자는 하나의 비트씩 독립적으로 동작한다. 다음은 char a = 10; 과 같이 선언되었을 때 비트곱 연산의 결과이다.

 

 

 AND(& :bitwise AND)는 논리 AND(&&)와 유사하다. 논리 AND에서는 양측의 피연산 값이 참(1)이면 결과는 참(1)이다. 비트와이즈 AND(&)에서는 양측 피연산자의 값의 대응 비트가 참(1)이면 결과 비트는 참(1)이다. 비트 와이즈 AND(&)는 독립적으로 각 비트에 동작하고 논리 AND(&&)는 보통 피연산값에 동작한다.

 

// & 연산자
#include <stdio.h>

int main() {
	char a = 'a';
	char b = 'b';
	char m = (char)0xdf;
	char n = 1;

	printf("a & m : %o \n", a & m);
	printf("b의 첫번째 비트 : %d \n", b&n);
	return 0;
}

 

 

 

비트 단위 OR( | : bitwise OR) 연산자

 | 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 연산이다. char ch = 'A'와 같이 선언되었을때 비트 논리합 연산의 결과이다. ( 'A'는 ASCII 코드값으로 0x41 이다.)

// | 연산자
#include <stdio.h>

int main() {
	int a = 15;
	int b = 20;
	int c = a | b;
	printf("OR 연산 결과 : %d\n", c);
	return 0;
}

 

 

배타적 논리합(^ : bitwise exclusive OR) 연산자

 ^(XOR) 연산자는 2개의 피연산자들 중에서 어느 한 쪽이 1이고 다른 한 쪽이 1이 아니면 결과는 1이다. 즉, 두 개의 비트가 서로 다를 경우에 1을 반환하는 연산이다. 

char a = 0x62

char b = 15;   와 같이 선언되어있을때 XOR 연산 결과이다.

 

 

 

 

비트단위 NOT(~ : bitwise NOT) 연산자

 ~ 연산자는 유일한 단항 연산자이며 피연산자의 각 비트를 0이면 1로, 1이면 0으로 바꾼다. 피연산자의 모든 값이 반대로 바뀌므로 1의 보수를 구하게 된다.

#include <stdio.h>

int main(void)
{
	int a = 35;
	printf("a에 대한 1의 보수 값 : %u \n", ~a);
	printf("a에 대한 2의 보수 값 : %d \n", ~a + 1);
	return 0;
}

 

비트이동연산자

비트를 이동시키는 연산자에는 2가지가 있다. 하나는 << 연산자이고, 또 하나는 >> 연산자이다.

 

왼쪽 쉬프트(<<) 연산자

왼쪽 쉬프트 연산자는 지정한 수 만큼 비트를 왼쪽으로 이동한다. 왼쪽으로 이동하는 비트는 없어지고 오른쪽으로 오는 새로운 비트는 0이 된다.

왼쪽으로 1비트 이동(x<<1)하는 것은 2(x*2)를 곱하는 것과 같다. 왼쪽으로 2비트 이동(x<<2)하는 것은 4(x*4)를 곱하는 것과 같다. 즉, 왼쪽으로 n비트 이동(x<<n)하는 것은 2의 n제곱해주는 것과 같다.

 

 

 

오른쪽 쉬프트(>>) 연산자

 오른쪽 쉬프트 연산은 왼쪽 쉬프트 연산과 비슷하다. 다만, 비트들을 이동시키는 방향만 다를뿐이다. >> 연산은 부호가 없는 변수에 대해서는 오른쪽으로 밀려나는 비트는 소멸되고, 왼쪽의 빈자리는 0으로 채워진다. 부호가 있는 변수에 대해서는 오른쪽으로 밀려나는 비트는 소멸될 것이고, 왼쪽의 빈자리는 1로 채워진다.

 

 

 

#include <stdio.h>

int main(void)
{
	int a = 0x4;
	int b = 0x80000004;
	unsigned int c = 0x80000004;
	printf("a = %d, b = %d, c = %u \n", a, b, c);
	printf("a << 2 => %d \n", a << 2);
	printf("a >> 2 => %d \n", a >> 2);
	printf("a >> 3 => %d \n", a >> 3);
	printf("b << 1 => %d \n", a << 1);
	printf("b >> 1 => %d \n", a >> 1);
	printf("c >> 1 => %d \n", a >> 1);
}

 

 

조건연산자(?)

유일한 삼항연산자로 3개의 피연산자를 가진다.

피연산자1이 참이면 피연산자2가 결과가 되고, 거짓이면 피연산자3이 결과가 된다.

int a = 10, b = 5; int min;과 같이 선언되어 있을 경우, 

min = (a>b) ? a : b; 식에 의해 min의 값은 10이 된다.

 

#include <stdio.h>

int main(void)
{
	int sub;
	int a, b;
	printf("정수 두 개를 입력하시오 : ");
	scanf_s("%d %d", &a, &b);

	sub = (a > b) ? (a - b) : (b - a);
	printf(" 두 정수의 차는 %d 입니다.\n", sub);
        return 0;
   
}

 

 

ㅡ 비트연산자 실습 문제 ㅡ

1. 정수를 입력받아 음수이면 양수로, 양수이면 음수로 출력하는 프로그램을 작성하시오.

(-7이 입력되면 7이 출력되고, 29가 입력되면 -29가 출력됨. 반드시 비트단위 연산자를 사용해서 구현)

#include <stdio.h>

int main(void) {
	/*정수를 입력받아 음수면 양수, 양수면 음수로 출력하는 프로그램*/
	/*-7입력하면 7, 29가 입력되면 -29가 출력됨. 비트단위 연산사용*/

	int iNum;
	printf("정수 1개를 입력하세요 : ");
	scanf_s("%d", &iNum);
	printf("입력한 수의 반대 부호 : %d\n", ~iNum+1);
	printf("입력한 수의 반대 부호 : %d\n", iNum*(-1));
	printf("입력한 수의 반대 부호 : %d\n", -iNum);
    
    return 0;
}

 

 

2. 정수 값 두 개를 입력받아서, 앞의 정수가 뒤의 정수보다 크면 1, 같으면 0 그리고 작으면 -1을 출력하는 프로그램을 작성하시오.(반드시 조건연산자를 사용해서 구현)

 

#include <stdio.h>

int main(void) {
	/*정수 값 두개를 입벽받아서, 앞의 정수가 
	뒤의 정수보다 크면 1, 같으면 0, 작으면 -1을 출력하는 프로그램 작성*/
	int iNum1, iNum2;
	int Com;
	printf("정수 2개를 입력하세요 : ");
	scanf_s("%d %d", &iNum1, &iNum2);
	
    Com = (iNum1 > iNum2) ? 1 : (iNum1 < iNum2) ? -1 : 0;
	
    printf("\n크면 1, 작으면 -1, 같으면 0 이 출력됩니다. ==> ");
	printf("%d\n", Com);
    
    return 0;
}

반응형