使用类型转换或使用尾随数据类型标识符.(uint16_t)10 或 10u



为了在 16 位机器中对不同数据类型操作数进行减法运算时得出正确答案(请参阅下面的代码(,我知道将10更改为 10u 将提供正确答案。

我习惯于类型转换而不是使用尾随数据类型标识符:使用 (uint16_t)10 而不是 10u

首选方式是什么?

我知道10u打字要少得多。除了减少打字的好处之外,10u是一种更好的方法,还有什么重要的原因吗? 还是真的无所谓?

#include <stdint.h>
uint16_t   u16c;
int32_t    s32;
int main()
{
    u16c = 100U;
    s32  = 10 - u16c;
}

类型 unsigned 通常不是任何特定固定大小类型的同义词。 无论unsigned的大小如何,表达式10u都将生成类型 unsigned,而表达式 (uint16_t)n 将在int无法表示所有值 0-65535 的平台上生成无符号值,或者在可以表示的平台上生成有符号值。 这在以下情况下可能至关重要:

unsigned mul_mod_65536(uint16_t x, uint16_t y)
{ return (x*y) & 65535u; }

某些用于 32 位系统的编译器将生成在在某些情况下,x 和 y 的乘积超过 2147483647,即使硬件乘法指令的底部 16 位是正确的。可以通过将其编写为:

unsigned mul_mod_65536(uint16_t x, uint16_t y)
{ return (1u*x*y) & 65535u; }

请注意,将 1 转换为 (uint16_t( 不会解决任何问题,因为这会只需转换回签名int即可。

不是答案 - 只是太长了,无法发表评论。

强制转换的问题在于它隐藏了编译器会挑选的警告。 例如

uint16_t x = (uint16_t) 70000;  /* No warning */
uint16_t y = (uint16_t) -1;     /* No warning */
uint16_t z = 70000U;            /* Compiler warning */
uint16_t a = -1;                /* Compiler warning */

当您转换为 Unicode 时,情况会变得更糟。 也许你应该读一下演员表,因为我想我知道我在做什么

最新更新