2017-12-20 7 views
-4

A 및 B 값의 결과는 다음과 같습니다.C 언어 데이터 구조를 설명하십시오

A:-121.000000, B:4294967296.000000 

왜 A와 B가 다른지 궁금합니다.

데이터 구조에 대한 기본 지식을 알려주십시오. 첫 번째 경우

int main() { 

uint8_t data[8]; 
data[0] = 0x3C; 
data[1] = 0x00; 
data[2] = 0x00; 
data[3] = 0x00; 
data[4] = 0x87; 
data[5] = 0xFF; 
data[6] = 0xFF; 
data[7] = 0xFF; 

float A; 
float B; 

A = 
    (uint8_t) data[4] | 
    (uint8_t) data[5] << 8 | 
    (uint8_t) data[6] << 16 | 
    (uint8_t) data[7] << 24; 

B = 
    (uint32_t) data[4] | 
    (uint32_t) data[5] << 8 | 
    (uint32_t) data[6] << 16 | 
    (uint32_t) data[7] << 24; 

printf("A:%f, B:%f", A, B); 

return 0; 
} 
+0

이유는 암시적인 정수 승격입니다. 너무 많은 질문이 있습니다. 연결된 복제본을 연구하십시오. – Lundin

답변

0

은 오른쪽의 식의 형태는 int이고 값이 -121이다. 두 번째 경우에는 유형이 uint32_t이고 값은 uint32_t(-121) == 4294967175입니다. 후자는 float에 정확하게 표현 될 수 없으므로 반올림됩니다.

+1

여기 미묘한 점은'uint8_t'는 부호없는 타입 인 반면 시프트 연산의 왼쪽 피연산자로 사용되면'unsigned int'가 아닌'int'로 승격된다는 것입니다. 마지막으로 서명 된 왼쪽 쉬프트의 결과는 네거티브 'int'값을 가져오고 (기술적으로는 부호 변경이 오버 플로우로 간주됩니다), float으로 변환하면 음수로 유지됩니다. –