我已经看到许多使用类型转换的文字定义。
例如#define THE_ANSWER ((uint8_t) 42)
。
直到现在,我几乎无法想象这真的很重要的情况。
有人可以给我一个例子,其中没有类型强制转换的#define指令会导致“意外”行为。 也许有一个很好的桌面环境示例,而一个嵌入式或微控制器环境示例。
谢谢您的建议。
答案 0 :(得分:1)
一个例子是乘法。假设您具有以下条件:
#define KILO 1024
如果稍后再执行以下操作会发生什么?
unsigned long long val = KILO * KILO * KILO * KILO * KILO * ...
您可能会认为乘法将使用类型unsigned long long
进行求值,但实际上所有这些乘法都发生在int
上。因此,如果您的指令没有类型转换,或者更好的是它不是1024L
,则可能会由于int
溢出而导致意外行为,即使变量的类型实际上可以保存结果