为了在 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 时,情况会变得更糟。 也许你应该读一下演员表,因为我想我知道我在做什么