【发布时间】:2014-09-01 12:22:53
【问题描述】:
如果我忘记了 ANSI C 中常量(文字)的后缀(后缀),有人可以向我解释一下会发生什么吗?
例如,我看到了位移操作这样的定义:
#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. */
用于 32 位架构。但它可以移植到 16 位或 8 位。 如果不使用后缀 UL 会发生什么情况,我将按照预期使用这些宏进行位移操作?
我只是假设,例如在 8 位架构中可以 (1
编辑:我找到了不错的链接:http://dystopiancode.blogspot.cz/2012/08/constant-suffixes-and-prefixes-in-ansi-c.html
但是,如果代码应该移植到各种架构上,那么使用后缀是否安全?
例如,如果后缀 U 表示 unisgned int,那么对于 8 位架构,它通常是 16 位,但对于 32 位,它是 32 位变量,所以 0xFFFFAAAAU 对于 32 位编译器来说是可以的,但对于 8 位编译器来说是不行的,对吧?
【问题讨论】:
-
“8位架构”不等于“最多只能数255”。由编译器负责将所有超过总线大小的计算转换为更容易消化的块。