使用 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
指向的结构中名为attempts
的uint16_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 被转换为 x
、int
的类型,并且表示该值的字节在类型 int
存储在 x
.
将整数值转换为另一种整数类型一定会产生相同的值,只要目标类型可以表示所讨论的值。一个4字节的int
就能表示std::uint16_t
.
的所有值
我正在尝试调试别人的代码。
有一个包含各种大小元素的结构,包括一个定义为
的成员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
指向的结构中名为attempts
的uint16_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 被转换为 x
、int
的类型,并且表示该值的字节在类型 int
存储在 x
.
将整数值转换为另一种整数类型一定会产生相同的值,只要目标类型可以表示所讨论的值。一个4字节的int
就能表示std::uint16_t
.