반응형

int num1 = 10;
int num2 = 20;
int num3 = num1/num2; //0

코드를 위와 같이 작성했을때 num1에서 num2를 나누면 결과가 0.5가 나와야하지만 0이 나온다!

1차적인 이유는 나누기의 결과를 반환받아야하는 num3가 정수형이기 때문이다!

int num1 = 10;
int num2 = 20;
float num3 = num1/num2; //0

그래서 num3의 자료형을 float로 바꿔보아도 출력해보면 0이 나올 것이다! (또잉~~)

문제의 원인은 num1/num2에서 이미 에러가 났기 때문이다!

 

아두이노에서는 정수를 정수로 나누면 (묵시적으로) 결과도 정수형이라고 판단한다!

왜냐면 유저가 알려주지 않았기 때문!

 

나누기 연산을 할때는 분자나 분모 둘중 하나가 실수형이면 이런 문제는 해결된다!

아래와 같은 여러가지 전략을 생각해볼 수 있다!

float num1 = 10;
float num2 = 20;
float num3 = num1/num2; //0.5

원래부터 실수형으로 가버린다!

int num1 = 10;
int num2 = 20;
float num3 = (float)num1/num2; //0.5

분자나 분모 둘중 하나를 float로 (명시적 형변환)을 한다!

이런 방식을 명시적으로 형변환을 했다고 표현한다!

 

그리고 묵시적 형변환도 있다!(녹칸다는 이러한 개념을 자주 사용한다)

float num3 = 10/20; //0

코드를 이렇게 쓰면 결과가 0이 나온다!

10과 20은 정수이기 때문이다!

명시적으로 형변환을 하면 아래와 같이 할 수 있다!

float num3 = (float)10/20; //0.5

그럼 결과가 0.5가 나오게 될 것이다!

여기서 묵시적 형변환이란 분모나 분자에 상수로 지정된 숫자 둘중 하나를 실수형으로 만들어 버리는 것이다!

float num3 = 10/20.0; //0.5

10은 정수이지만 20.0은 실수이므로 아~~ 정수와 실수를 나눴으니 실수형으로 반환하면 되는구나~~ 라고 판단한다!

이런 방식을 묵시적 형변환이라고 한다!

 

가장 흔하게 사용되는 예시!

이산화탄소센서가 측정하는 센서값은 0~5000범위로 정수형으로 값이 측정이 된다! 지금 측정한 센서데이터를 100분율로 표현하라!(퍼센트로)

int co2_sensor = 2500;
float percent = (co2_sensor/5000)*100; //0

이러면 0이 나올 것이다!

아래와 같이 묵시적 형변환으로 계산하면 아~주 쉽게 해결된다!

int co2_sensor = 2500;
float percent = (co2_sensor/5000.0)*100; //50

끝!!!!!!

반응형
Posted by 덕력킹
,