C/C++字面值

15

有人能帮我在C99和C++03标准中找出下面一行代码会发生什么吗?

uint16_t a = 5;

左侧是已键入的变量,右侧是常量。何时以及如何将常量值的类型与变量匹配?

上述赋值是否等同于下面的语句?

uint16_t a = (uint16_t)5;  /* C */
uint16_t a = reinterpret_cast<uint16_t>(5);  // C++

如何:

uint16_t a = 5u;

那么如果你有这样的内容:

uint32_t b = a + 5;

上述语句是否等价于下面的语句?

uint32_t b = (uint32_t)(a + (uint16_t)(5));  /* C */
uint32_t b = reinterpret_cast<uint32_t>(a + reinterpret_cast<uint16_t>(5));  // C++

C11和C++14中有哪些变化?请假设系统int为32位。

我已经使用C语言编程一段时间了,但从来没有真正深入地理解它,这总是让我感到困扰,如果有人能帮我整理一下,我会非常感激。

谢谢...

(编辑:添加了假设int为32位的条件)


6
最终我们有一个同时标记了C和C++的问题,它确实与两者都相关 :) - Eregrith
4
这应该使用 static_cast 而非 reinterpret_cast(后者仅适用于涉及指针和引用的类型转换)。 - Mike Seymour
5int 类型,而 5uunsigned int 类型。 - user3528438
有关算术运算,请参见http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_promotion - Seçkin Savaşçı
1个回答

6
规则是首先评估RHS,然后将该值转换为目标类型。特别是:
uint32_t b = a + 5;

等同于

uint32_t b = (uint32_t)((int)a + 5);

如果uint16_t是一个窄类型,比int还要窄。
在C语言中的所有操作(我认为在C++中也是如此)都至少是int整型级别。

uint32_t a = 1.8 + 0.3; 这个也是一个很好的例子吗?(由于在将浮点数转换为整数类型时会截断小数部分,结果2表明这些值在被转换之前已经被相加。) - Jongware
"int的等级". 在我看来,字节才是真正重要的。 - Imobilis
@Jongware,好的例子。首先右侧的表达式被评估为“double”,然后转换为“uint32_t”。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接