sample code:
#define minM(A,B)( (((A) > (B) ) ? (B) : (A))
uint32_t VUL_01;
uint32_t VUL_02;
uint32_t VUL_03;
...
//case 1
VUL_03 = minM(4294967295, (VUL_01 + VUL_02));
// 이부분은 (VUL_01 + VUL_02)의 값이 int 32 bit 범위 (4294967295)를 넘어가게되면 data 손실이 일어나게 된다.
//case 2
VUL_03 = (uint32_t)minM(4294967295, (float32_t)VUL_01 + (float32_t)VUL_02));
// 이부분은 (VUL_01 + VUL_02)의 값이 int 32 bit 범위 (4294967295)를 넘어가게 되면서 생기는 data 손실은 없지만
// int -> float -> int 의 type casting을 하면서 생기는 오차가 생긴다.( float는 수표현 + 자릿수표현 나타낸다. 이에 따라 수표현에 27?28?bit정도만 사용하기 때문에 이 오차에 따른 손실이 발생한다.
//case 3
VUL_03 = VUL_01 + VUL_02;
if (VUL_03 < VUL_01)
{
VUL_03 = 0xFFFFFFFFU;
}
// 이렇게 사용하면 data의 손실이 발생하지 않는다.
// 하지만 "VUL_03 = VUL_01 + VUL_02; " 에서 overflow를 유발한다.
//하지만 이렇게 사용하는 개발자들은 이를 감안하고 사용한다.
(테스트툴에 따라 overflow를 검출해주는 툴이 있다면 위는 잘못됐다고 나타날것이다.)
//대부분의 개발자들은 case 3 을 많이 사용한다.
0 댓글