학습자료(~2017)/팁

[자동 형변환] int 보다 작은 데이터 형의 연산시 문제점

단세포소년 2012. 12. 27. 20:11
반응형

int 보다 작은 데이터 형은 연산전에 int (정수) 형으로 캐스팅 된다.

암시적인 타입 캐스팅후 문제점이 아래에 있다. 너무나도 쉽게 넘어갈수 있는 문제지만 그 결과는 참담하다.
이제부터는 모든 연산에 대해서 타입 캐스팅을 확실히 해야겠다.

또한 왠만하면 연산을 한 라인에 쓰기 보다는 여러 라인으로 한 연산씩 처리해야겠다.
맨 아래의 해결 방법도 좋지만 이 방법도 사용해볼만 하다.

uint8_t port = 0x5a;
uint8_t temp = (~port);
uint8_t result_8 = temp >> 4;




Noncompliant Code Example

This noncompliant code example demonstrates how performing bitwise operations on integer types smaller than int may have unexpected results.

uint8_t port = 0x5a;
uint8_t result_8 = ( ~port ) >> 4;

In this example, a bitwise complement of port is first computed and then shifted 4 bits to the right. If both of these operations are performed on an 8-bit unsigned integer, then result_8 will have the value 0x0a. However, port is first promoted to a signed int, with the following results (on a typical architecture where type int is 32 bits wide):

Expression

Type

Value

Notes

port

uint8_t

0x5a

 

~port

int

0xffffffa5

 

~port >> 4

int

0x0ffffffa

Whether or not value is negative is implementation-defined.

result_8

uint8_t

0xfa

 

Compliant Solution

In this compliant solution, the bitwise complement of port is converted back to 8 bits. Consequently, result_8 is assigned the expected value of 0x0aU.


uint8_t port = 0x5a;
uint8_t result_8 = (uint8_t) (~port) >> 4;

반응형