Kar*_*ick 7 c c++ casting type-conversion integer-promotion
uint32_t a = 10;
uint16_t b = 0;
if (a > b)
{
printf("a > b\n");
}
Run Code Online (Sandbox Code Playgroud)
我期望它b会被提升int,并且编译器会抱怨比较有符号和无符号。但编译器没有提出任何警告。
当我更改
if (a > b)为if (a > (b * 10))编译器时说
warning: comparison between signed and unsigned
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
将其类型转换为 uint32_t 是否安全?
if (a > (uint32_t)(b * 10))
Run Code Online (Sandbox Code Playgroud)
uint16_t 是否提升为 int?
如果int是32位的,当然可以。如果没有,那么就不会推广。
我原以为 b 会晋升为 int
是的,在 32 位系统上。
但编译器没有提出任何警告。
跟踪这一点实际上并不是编译器的工作。如果你收到警告,这只是一个奖励。uint16_t但还请注意,在您的示例中,转换是通过两个内部步骤完成的:首先在make it上执行整数提升int。但紧接着,通常的算术转换将其转换int为uint32_t. 因此,本质上,就程序员而言,将uint16_t被转换为uint32_t并且该转换始终是安全的。
通常,混合不同大小的无符号操作数的操作是安全的。
if (a > (uint32_t)(b * 10))
b晋升为int并且10已经是int。乘法不可能溢出,因为它不能大于 655350。uint32_t如果您愿意,您可以稍后进行转换,但除了显式外,它不会实现任何目标。
更坚固的代码会在乘法之前完成转换,或者可能使用10u它来代替。但在这种具体情况下,这真的不重要。