4-1 계산
int a, b;
a = 10;
b = 3;
printf("a / b 는 : %f \n", a / b);
-(정수형 변수) (연산) (정수형 변수) 는 언제나 (정수) 으로 유지
따라서, 실수형 데이터를 출력하는 %f 를 정수형 값 출력에 사용하면 위와 같이 이상한 결과가 나오게 됩니다.
a / b 는 : 0.000000
a = 10;
b = 3;
printf("a / b 는 : %f \n", a / b);
printf("b / a 는 : %f \n", b / a);
컴파일러가 산술 변환 이라는 과정을 거치기 때문입니다. 즉, 어떠한 자료형이 다른 두 변수를 연산 할 때, 숫자의 범위가 큰 자료형으로 자료형들이 바뀝니다.
즉, 위 그림에서도 보듯이 a 가 int 형 변수이고 b 가 double 형 변수인데, double 이 int 에 비해 포함하는 숫자가 더 크므로 큰 쪽으로 산술 변환됩니다.
일단, 정수형 변수와 실수형 변수가 만나면 무조건 실수형 변수쪽으로 상승되는데, 이는 실수형 변수의 수 범위가 int 보다 훨씬 넓기 때문입니다.
a = 1;
printf("a++ : %d \n", a++);
printf("a : %d \n", a);
printf("++a : %d \n", ++a);
++a : 2
a++ : 1
a : 2
비트 연산자
and or xor ~ >>(쉬프트 연산)
<< 연산
위 처럼 결과가 010110 이 됩니다. 이 때, << 쉬프트 시, 만일 앞에 쉬프트된 숫자가 갈 자리가 없다면, 그 부분은 버려집니다. 또한 뒤에서 새로 채워지는 부분은 앞에서 버려진 숫자가 가는 것이 아니라 무조건 0 으로 채워집니다.
<<3 === 3칸 이동 쉬프트 연산
>> 연산
이는 위와 같은 종류로 이는 << 와 달리 오른쪽으로 쉬프트 해줍니다.
이 때, 무조건 0 이 채워지는 << 연산과는 달리 앞부분에 맨 왼쪽에 있었던 수가 채워지게 되죠. 예를들어서 11100010 >> 3 = 11111100 이 되고, 00011001 >> 3 = 00000011 이 됩니다.
int a = 0xAF; // 10101111
int b = 0xB5; // 10110101
printf("%x \n", a & b); // a & b = 10100101
printf("%x \n", a | b); // a | b =10111111
printf("%x \n", a ^ b); // a ^ b = 00011010
printf("%x \n", ~a); // ~a = 1....1 01010000
printf("%x \n", a << 2); // a << 2 = 1010111100
printf("%x \n", b >> 3); // b >> 3 = 00010110
a5
bf
1a
ffffff50
2bc
16
4번째 해설
int 는 4바이트 이기에 1을 저장시 00000000 00000000 00000000 00000001 으로 저장됨.
~ 연산시 11111111 11111111 11111111 11111110 으로 변경된다.