使用 C++ 指针时 -> 是否存在隐式数据类型转换

When using C++ pointer -> is there implicit Data type conversion

我正在尝试调试别人的代码。

有一个包含各种大小元素的结构,包括一个定义为

的成员

uint16_t attempts

在其他地方访问此元素

int x = handle->attempts;

int 在我的系统中是 32 位

是否可以安全地假设从结构 (uint16_t) 中指向的位置加载 2 个字节并隐式转换为 int(4 个字节)。

或者是否有可能将指向的 4 个字节作为一个 int 加载(在本例中是 2 个 uint16_t 成员的合并)?

int x = handle->attempts; 是带有初始化的声明。在此声明中,handle->attempts 是一个 初始化器 ,根据 C 2018 6.7 1 中的语法。 初始化器 是一个 assignment-expression,根据 C 2018 6.7.9 1,因此将使用表达式评估规则。

表达式handle->attempts 指定handle 指向的结构中名为attemptsuint16_t 成员。换句话说,它是成员的左值。根据 C 2018 6.3.2.1 2,此左值将转换为存储在指定对象中的值。因此,C 标准表示表示该对象的字节是根据 uint16_t 类型读取和解释的。

然后 C 2018 6.7.9 11 中的初始化规则告诉我们这个值用作被定义对象的初始值,x,使用与简单赋值相同的约束和转换。

C 2018 6.5.16.1 指定简单赋值。第 2 段说“右操作数的值被转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。”因此,我们从初始化程序中获得的 value 被转换为 xint 的类型,并且表示该值的字节在类型 int 存储在 x.

将整数值转换为另一种整数类型一定会产生相同的值,只要目标类型可以表示所讨论的值。一个4字节的int就能表示std::uint16_t.

的所有值