JUST GO

[C] 연산자(3) 본문

C/학습내용

[C] 연산자(3)

root_go 2022. 10. 5. 10:08

비트 NOT 연산

- 0은 1로, 1은 0으로 반전한다.

 

ex - 비트 논리 연산자의 사용

#include <stdio.h>

int main(void) 
{
	unsigned short x = 0x12;
	unsigned short y = 0xF0;

	printf("08x & %08x = %08x\n", x, y, x & y);  // 비트 AND
	printf("%08x | %08x = %08x\n", x, y, x | y); // 비트 OR
	printf("%08x ^ %08x = %08x\n", x, y, x ^ y); // 비트 XOR
	printf("~%08x = %08x\n", x, ~x);             // 비트 NOT

	return 0;
}
 
 

비트 이동 연산자

- 좌변에 있는 피연산자의 비트들을 우변의 피연산자가 지정하는 만큼 왼쪽으로 또는 오른쪽으로 이동(shift) 한다.

- 비트 왼쪽 이동(<<) 연산자

- 비트들을 왼쪽으로 이동한다.

- 왼쪽으로 밀려난 비트는 사라지고 오른쪽 빈 자리에 0을 채운다.

- n 비트 왼쪽 이동은 2n을 곱하는 것과 같다.

- 비트 오른쪽 이동(>>) 연산자

- 비트들을 오른쪽으로 이동

- 오른쪽으로 밀려난 비트는 사라지고 왼쪽 빈 자리에 부호 비트를 채운다.

- 연산자의 좌변이 부호 없는 정수형이면 왼쪽 빈 자리를 0으로 채운다.

- n 비트 오른쪽 이동은 2n 으로 나누는 것과 같다.

 

- 비트 왼쪽 이동

- 비트 오른쪽 이동


ex - 비트 이동 연산자의 사용

#include <stdio.h>

int main(void) 
{
	int x = 0x00000012;
	int y = x << 4;
	int z = x >> 4;

	printf("x = %#08x, %d\n", x, x); // 0x00000012, 18
	printf("y = %#08x, %d\n", y, y); // 0x00000120, 288 (18 * 16)
	printf("z = %#08x, %d\n", z, z); // 0x00000001, 1 (18 /16)


	return 0;
}
 

조건 연산자

- 피연산자가 3개인 삼항 연산자


ex - 조건 연산자의 사용

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) 
{
	int a, b;
	int result, max;

	printf("2개의 정수? ");
	scanf("%d %d", &a, &b);

	printf("%d는 ", a);
	a % 2 != 0 ? printf("홀수") : printf("짝수");
	printf("입니다.\n");

	result = a > 0 ? a : -a;
	printf("a의 절대값: %d\n", result);

	result = b > 0 ? b : -b;
	printf("b의 절대값: %d\n", result);

	max = a > b ? a : b;
	printf("a, b 중 큰 값: %d\n", max);


	return 0;
}
 

콤마 연산자

- 수식의 값을 왼쪽부터 계산해서 마지막으로 계산한 오른쪽 수식의 값이 연산의 결과가 된다.

- 여러 수식을 한 문장으로 연결할 때 주로 사용된다.

 

암시적인 형 변환

- 서로 다른 데이터형의 값을 혼합 연산할 때 암시적인 형 변환이 일어난다.

- 정수의 승격

- char형이나 short형의 값이 사용될 때마다 자동으로 int형으로 형 변환된다.

- 정수의 승격도 암시적인 형 변환이다.

- 대입 연산이나 변수의 초기화에서도 암시적인 형 변환이 수행된다.

- 대입 연산자의 좌변과 대입 연산자의 우변의 데이터형이 다르면,

좌변의 데이터형에 맞추도록 형 변환이 일어난다.

- 이 때 값이 손실되면, 컴파일 경고가 발생한다.


ex - 암시적인 형 변환

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) 
{
	short a, b, c;

	printf("정수 2개? ");
	scanf("%hd %hd", &a, &b); // short형 변수 입력시 %hd 사용

	printf("%d * %d = %d\n", a, b, a * b);         // a * b는 int * int로 처리
	printf("sizeof(a * b) = %d\n", sizeof(a * b)); // 4

	c = a * b; // int형인 (a * b)를 short형으로 변환해서 대입
	printf("c = %d\n", c);
	printf("sizeof(c) = %d\n", sizeof(c)); // 2

	return 0;
}
 

정수의 승격과 오버플로우

 

형 변환 연산자

- 명시적인 형 변환

- / 연산의 결과를 실수로 구하려면 명시적인 형 변환이 필요하다.

- 형 변환 연산자를 사용할 때는 형 변환이 언제 수행되는지에 따라 연산의 결과가 달라진다.


세 수의 평균 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) 
{
	int a, b, c;
	double average;

	printf("정수 3개? ");
	scanf("%d %d %d", &a, &b, &c);

	average = (double)(a + b + c) / 3; // 명시적인 형 변환 필요
    // / 연산자의 피연산자 중 하나를 실수형으로 형 변환 한다.
	printf("평균: %f\n", average);

	return 0;
}
 

연산자의 우선순위

- '변수 = 수식'의 형태인 경우 항상 수식의 값을 먼저 계산한다.

- 관계 연산자는 논리 연산자보다 우선순위가 높다.

- 산술 연산자는 관계 연산자나 논리 연산자보다 우선순위가 높다.


연산자의 결합 규칙

- 대부분의 연산자는 좌 -> 우 방향으로 결합하고 단항 연산자와 대입 연산자는 우 -> 좌 방향으로 결합한다.

'C > 학습내용' 카테고리의 다른 글

[C] 제어문(switch문)  (0) 2022.10.05
[C] 제어문(if문)  (0) 2022.10.05
[C] 연산자(2)  (1) 2022.10.05
[C] 연산자(1)  (0) 2022.10.05
[C] C언어와 프로그래밍 개요  (0) 2022.10.05