달력

1

« 2020/1 »

  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  


 

비트 연산자(bitwise operator)

·       Bit Operator

·       피연산자 연산의 대상이 되는 값들을 내부적으로 bit(비트)단위 변경한 연산을 수행하는 연산자입니다.

·       논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 수행합니다.

·       0 1 자리에 대한 연산을 수행하며, 0 또는 1 결괏값을 가진다.

·       하드웨어와 관련된 처리를 쉽게 해줍니다.

·       메모리 공간을 줄여서 성능을 높여 있습니다.

 

 

 

'Development > C/C++' 카테고리의 다른 글

C  (0) 2019.05.29
반복문  (0) 2019.05.28
비트 연산자(bitwise operator)  (0) 2019.05.28
비트(Bit)  (0) 2019.05.27
바이트(byte)  (0) 2019.05.27
fread( ) 함수와 fwrite( ) 함수 - 바이너리 파일 입출력  (0) 2019.05.26
Posted by codedragon codedragon

댓글을 달아 주세요


 

실수

·         소수부나 지수부가 있는 수를 가리킵니다.

·         소수점을 가진 숫자를 표현합니다.

·         정수보다 훨씬 넓은 표현 범위를 가집니다.

·         정수 표현방식보다 중요합니다.

·         실수는 오차 동반

 

 

 

실수 표현

실수 표현의 문제점

·         0 1사이의 실수만 해도 수가 무한대

·         단순히 바이트 정도로 모든 실수를 표현하는 것은 불가능합니다.

 

 

문제점에 대한 해결책

정확도를 포기하고, 대신에 표현할 있는 값의 범위를 넓히고 근사값을 사용합니다.

 

 

0 1 통한 정수와 실수 표현


1.1 1.2사이에도 무한 대의 실수값이 존재하므로 0 1로는 정확한 실수값을 표현할 없는 한계 있습니다.

실수를 표현하기 위한 한계를 해결하기 위해 근사치를 사용하게 됩니다.

실수형 데이터의 오차는 자바뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제입니다.

 

 

 

 

 

Posted by codedragon codedragon

댓글을 달아 주세요


 

형변환

타입의 데이터가 다른 타입으로 변환하는 형변환, 자료형 변환, 타입 변환이라고 합니다.

타입 변환은 크게 자동 타입 변환과 강제 타입 변환으로 구분됩니다.

 

 

 

자료형 변환의 종류

자동 형변환

컴파일러가 자동 형변환 시킵니다

강제 형변환

프로그래머가 강제 형변환 시킵니다

 

 

 

자동 형변환

·       다른 자료형 산술 연산의 경우에 작은 자료형에서 자료형으로 자동 형변환

 

 

정수 + 실수 또는 실수 + 정수와 같은 산술 연산을 하는 경우 자동 형변환

#include <stdio.h>

int main(void)

{

   int       num1=100;        // 정수

   double num2=3.14;        // 실수

   printf("%lf \n", num1+num2);    // 정수 + 실수

   return 0;

}

 

 

자료형 변환 우선순위 (작은 자료형에서 자료형으로…) 자동 형변환

char < int < long < float < double < long double

 



 

대입 연산자를 기준으로 오른쪽에서 왼쪽으로 자동 형변환

#include <stdio.h>

int main(void)

{

   char     num1=130;

   int       num2=3.14;

   double num3=3;

   printf("%d, %d, %lf \n", num1, num2, num3);

   return 0;

}

 

 

Posted by codedragon codedragon

댓글을 달아 주세요

   

   

자바의 자동 형변환 규칙(Implict Conversion)

값의 표현 범위로 자동 형변환됩니다.


   

 

double num = 3.14f + 10;

//10 10F 자동 형변환

 


Posted by codedragon codedragon

댓글을 달아 주세요

   

실수 자료형 선택 기준 (float vs double)

  • float와 double 모두 매우 충분한 표현 범위를 가지고 있지만
  • 이 둘의 가장 큰 차이점은 정밀도가 다릅니다.
  • 따라서 필요한 정밀도를 바탕으로 자료형을 결정해야 하며
  • 일반적으로 double 자료형 선택을 권장합니다.

 

   

   

Posted by codedragon codedragon

댓글을 달아 주세요

자동 형변환 (산술연산)

다른 자료형 간 산술 연산의 경우에 작은 자료형에서 큰 자료형으로 자동 형변환

   

   

소스코드

   

#include <stdio.h>

int main(void) {

int num1=100; // 정수

double num2=3.14; // 실수

//작은 자료형에서 자료형으로 자동 형변환

printf("%lf \n", num1+num2); // 정수 + 실수

printf("%lf \n", num1/num2); // 정수 + 실수

//2째자리까지 출력

printf("%.2lf \n", num1+num2); // 정수 + 실수

return 0;

}


   

   

출력결과

   

Posted by codedragon codedragon

댓글을 달아 주세요

float형 오차 발생

실수형은 기본적으로 double형을 선호

C언어 컴파일러는 기본적으로 실수를 소수점 6자리 출력해 줍니다.


 

소스코드

#include <stdio.h>

int main(void) {

float num1=0.123456789012345;

double num2=0.123456789012345;

printf("float : %f \n", num1); //0.123457 출력

//0.123456 789012345

printf("double : %lf \n", num2); //0.123457 출력

//6째자리까지 반올림해서 표현

//%.15f: float형을 15자리까지 표현

printf("float : %.15f \n", num1); //0.123456791043282 출력

//0.123456 789012345

//float형은 6째자리까지가 의미있는 데이터, 그래서 6자리를 넘어서는 자리부터는 데이터의 오차가 발생

printf("double : %.15lf \n", num2); //0.123456789012345 출력

float num3=0.123456; // float num1=0.123456F;

//실수형은 기본적으로 double형을 선호하기 때문에 double형으로 연산을 수행하게 됩니다.

//double형을 float형으로 변환시 데이터 손실이 발생할 있으므로 명시적으로 숫자뒤에 F 붙여주어야 합니다.

//(큰자료형에서 작은자료형으로 변환되므로)

//해결방법: 출력을 %lf하거나 자료형뒤에 F 붙여 명시적으로 float형임을 표시해줍니다.

printf("float : %f \n", num3); // 0.123456(소수점 6자리까지 출력)

printf("float : %.2f \n", num3); // 0.12(소수점 2자리까지 출력)

return 0;

}


   

   

출력결과

   

Posted by codedragon codedragon

댓글을 달아 주세요

양수/음수에서 비트단위 이동 연산 수행

   

   

   

소스코드

   

#include <stdio.h>

int main(void)

{

int num1=10;

//00001010

int num2=-10;

//11110101 (1의보수)

//11110110 (1 더함) //-10

int result1;

int result2;

result1 = num1 >> 1;

//00000101

//양수인경우 0으로 채움

result2 = num2 >> 1;

//11111011 //-5

//음수인경우 1 채움

//오른쪽으로 1비트씩 이동할 마다 2 나누어집니다.

//11111011 //-5

//00000100 (1의보수)

//00000101 (1 더함) //5

printf("비트단위 >> 연산 결과: %d \n",result1); //5

printf("비트단위 >> 연산 결과: %d \n",result2); //-5

return 0;

}


   

   

출력결과

 

Posted by codedragon codedragon

댓글을 달아 주세요

비트단위 << 연산, 비트단위 >> 연산

   

   

소스코드

int main(void) {

int num1=10;

// 00001010

int result1;

result1 = num1 << 2;

// 0 0 1 0 1 0 0 0

//왼쪽 시프트시 남은 공간은 0으로 채웁니다.

//왼쪽으로 1비트씩 이동할 마다 2 곱해집니다.

printf("비트단위 << 연산 결과: %d \n", result1); //결과 40

return 0;

}


   

 

출력결과


 

Posted by codedragon codedragon

댓글을 달아 주세요

비트연산자

비트 단위 AND 연산, 비트 단위 OR 연산, 비트 단위 XOR 연산, 비트 단위 NOT 연산

 


&연산자 vs 주소연산자

피연산자사이의 &

&연산자

변수앞의 &

주소연산자

   

   

소스코드

   

#include <stdio.h>

int main(void) {

int a=12;

// 128 64 32 16 8 4 2 1

// 0 0 0 0 1 1 0 0

int b=20;

// 128 64 32 16 8 4 2 1

// 0 0 0 1 0 1 0 0

int result1, result2, result3, result4;

result1 = a & b;

// 128 64 32 16 8 4 2 1

// 0 0 0 0 1 1 0 0

// 0 0 0 1 0 1 0 0

//----------------------

// 0 0 0 0 0 1 0 0

printf("a: %d \n", a);

printf("b: %d \n", b);

printf("비트단위 & 연산 결과: %d \n\n",result1); // 결과 4

result2 = a | b;

// 128 64 32 16 8 4 2 1

// 0 0 0 0 1 1 0 0

// 0 0 0 1 0 1 0 0

//----------------------

// 0 0 0 1 1 1 0 0

printf("a: %d \n", a);

printf("b: %d \n", b);

printf("비트단위 | 연산 결과: %d \n\n",result2); // 결과 28

result3 = a ^ b;

// 1 2 결과

// 0 0 0

// 1 0 1

// 0 1 1

// 1 1 0

printf("a: %d \n", a);

printf("b: %d \n", b);

printf("비트단위 ^ 연산 결과: %d \n\n",result3); // 결과 24

//~ 연산자

result4 = ~ a;

// 128 64 32 16 8 4 2 1

// 0 0 0 0 1 1 0 0

// 1 1 1 1 0 0 1 0

printf("a: %d \n", a);

printf("비트단위 ~ 연산 결과: %d \n",result4); // 결과는

return 0;

}


   

   

출력결과

   

Posted by codedragon codedragon

댓글을 달아 주세요