ANSI C의 상수 (리터럴)에 접미어 (후치)를 잊어 버리면 어떻게 될지 설명 할 수 있습니까? 그것은 32 비트 아키텍처에리터럴 접미사 U, UL 문제
#define AAR_INTENSET_NOTRESOLVED_Pos (2UL) /*!< Position of NOTRESOLVED field. */
#define AAR_INTENSET_NOTRESOLVED_Msk (0x1UL << AAR_INTENSET_NOTRESOLVED_Pos) /*!< Bit mask of NOTRESOLVED field. */
#define AAR_INTENSET_NOTRESOLVED_Disabled (0UL) /*!< Interrupt disabled. */
#define AAR_INTENSET_NOTRESOLVED_Enabled (1UL) /*!< Interrupt enabled. */
#define AAR_INTENSET_NOTRESOLVED_Set (1UL) /*!< Enable interrupt on write. */
을 사용되는 :
예를 들어 나는 비트 시프트 연산 등의 정의를 보았다. 그러나 16 비트 또는 8 비트로 이식 될 수 있습니다. postfix UL을 사용하지 않고 비트 시프트 작업에이 매크로를 사용한다면 어떻게됩니까?
8 비트 아키텍처에서 (1 < < 30) 오버 플로우가 발생할 수 있습니다.
편집 : 나는 좋은 링크를 발견 : http://dystopiancode.blogspot.cz/2012/08/constant-suffixes-and-prefixes-in-ansi-c.html
을하지만 코드가 다양한 아키텍처에 포팅 될 것으로 예상되는 경우 접미사를 사용하는 것이 안전합니다?
예를 들어 접미사 U가 unbitned int를 나타내는 경우 8 비트 아키텍처의 경우 보통 16 비트이지만 32 비트 변수는 32 비트이므로 0xFFFFAAAAU는 32 비트 컴파일러에서는 괜찮지만 8 비트 컴파일러에서는 그렇지 않습니다.
"8 비트 아키텍처"는 "최대 255 개까지만 계산할 수 있습니다"와 같지 않습니다. 버스 길이보다 긴 모든 계산을 더 쉽게 소화 할 수있는 덩어리로 변환하는 것은 컴파일러의 몫입니다. – usr2564301