C语言 强制转换为“较大”类型时,最高有效位设置为什么?

dgenwo3n  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(128)

在C/C++中,当我执行以下类型转换时:

uint8_t a = 0xAB;

//In C++
uint32_t b = static_cast<uint32_t>(a);

//In C
uint32_t c = (uint32_t)a;

我假设“较大”类型(b)的最高有效位都是零,当从位数较少的类型强制转换为位数较多的类型时,标准能保证这一点吗?

tsm1rwdh

tsm1rwdh1#

C和C技术术语在这方面有点不同。我将使用C术语,但所传达的思想适用于这两种语言。
类型转换,比如那些由C风格转换和C
static_cast生成的类型转换,是对值的操作,而不是对对象的操作,它们的结果也是值,而不是对象。操作数和结果值的 * 表示 *--包括任何特定位的值--没有被这些操作的规范所解决。
因此,你的问题的基本答案是,当应用于算术类型的值时,如果目标类型可以表示操作数值,则这些操作是值保留的。
关于你的例子,你问...
我假设“较大”类型(b)的最高有效位都是零。当从位数较少的类型强制转换为位数较多的类型时,标准是否保证了这一点?
根据整数类型表示的(单独)规范,转换是值保留方法

*对于非负操作数,如果源类型和目标类型都是整数类型,并且目标类型用比源类型多的值位表示,则结果的目标类型表示中与操作数值的源类型表示中的值位不对应的值位将取值0。
*对于负操作数,如果源类型和目标类型都是(有符号)整数类型,并且目的地类型用比源类型多的值位来表示 * 以二进制补码形式 *,则结果的目的地类型表示的不对应于操作数的源类型表示中的值位的值位将取值1。

eqqqjvef

eqqqjvef2#

类型uint8_t是无符号整数类型

uint8_t a = 0xAB;

因此,当此类型的对象强制转换为uint32_t类型时,该值将被保留,因为此类型的对象可以容纳值0xAB
其实演员表是多余的。你可以写

uint32_t c = a;

你甚至可以写

uint32_t a = 0xAB;
uint8_t c = a;

因为值0xAB同样可以存储在类型uint8_t的对象中。

相关问题