gcc를 사용하여 STM32F105에 대한 응용 프로그램을 c로 작성하고 있습니다.
과거에는 (간단한 프로젝트로) 항상 변수를 char
,, int
등 으로 정의 unsigned int
했습니다.
나는 같은 stdint.h에 정의 된 유형을 사용하는 것이 일반적입니다 것을 볼 int8_t
, uint8_t
, uint32_t
, 등이 그것 여러 API의 내가 사용하고 있음을, 또한 ST의 ARM CMSIS 라이브러리에서 사실.
나는 왜 우리가 그렇게해야하는지 이해한다고 믿는다. 컴파일러가 메모리 공간을 더 잘 최적화 할 수 있습니다. 추가 이유가있을 것으로 예상됩니다.
그러나 c의 정수 승격 규칙으로 인해 두 개의 값을 추가하거나 비트 연산 등을 시도 할 때마다 변환 경고에 대해 계속 실행됩니다. 경고는 다음과 같습니다 conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. 이 문제는 여기 와 여기에서 논의 됩니다 .
int
또는로 선언 된 변수를 사용할 때는 발생하지 않습니다 unsigned int
.
다음과 같은 몇 가지 예를 들자면 :
uint16_t value16;
uint8_t value8;
나는 이것을 바꿔야 할 것이다.
value16 <<= 8;
value8 += 2;
이에:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
추악하지만 필요한 경우 할 수 있습니다. 내 질문은 다음과 같습니다.
에서 변환 경우가 부호 에가 서명 하고 다시 서명이 결과가 잘못된 것은?
stdint.h 정수 유형을 사용하는 또 다른 큰 이유가 있습니까?
내가받는 답변을 바탕으로 stdint.h 유형이 일반적으로 선호되는 것처럼 보입니다 .c는 변환 하고 다시 변환 uint
합니다 int
. 이것은 더 큰 질문으로 이어집니다.
- typecasting (예 :)을 사용하여 컴파일러 경고를 방지 할 수 있습니다
value16 = (uint16_t)(value16 << 8);
. 방금 문제를 숨기고 있습니까? 더 좋은 방법이 있습니까?
value8 += 2u;
하고 value8 = value8 + 2u;
있지만이 같은 경고를 얻을.
8u
및)을 사용하십시오2u
.