카테고리 없음

c언어 공부 3일차 -2

jjon-jonny 2023. 9. 2. 19:39

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 으로 변경된다.