在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)的最高有效位都是零,当从位数较少的类型强制转换为位数较多的类型时,标准能保证这一点吗?
b
tsm1rwdh1#
C和C技术术语在这方面有点不同。我将使用C术语,但所传达的思想适用于这两种语言。类型转换,比如那些由C风格转换和Cstatic_cast生成的类型转换,是对值的操作,而不是对对象的操作,它们的结果也是值,而不是对象。操作数和结果值的 * 表示 *--包括任何特定位的值--没有被这些操作的规范所解决。因此,你的问题的基本答案是,当应用于算术类型的值时,如果目标类型可以表示操作数值,则这些操作是值保留的。关于你的例子,你问...我假设“较大”类型(b)的最高有效位都是零。当从位数较少的类型强制转换为位数较多的类型时,标准是否保证了这一点?根据整数类型表示的(单独)规范,转换是值保留方法
static_cast
*对于非负操作数,如果源类型和目标类型都是整数类型,并且目标类型用比源类型多的值位表示,则结果的目标类型表示中与操作数值的源类型表示中的值位不对应的值位将取值0。*对于负操作数,如果源类型和目标类型都是(有符号)整数类型,并且目的地类型用比源类型多的值位来表示 * 以二进制补码形式 *,则结果的目的地类型表示的不对应于操作数的源类型表示中的值位的值位将取值1。
eqqqjvef2#
类型uint8_t是无符号整数类型
uint8_t
uint8_t a = 0xAB;
因此,当此类型的对象强制转换为uint32_t类型时,该值将被保留,因为此类型的对象可以容纳值0xAB。其实演员表是多余的。你可以写
uint32_t
0xAB
uint32_t c = a;
你甚至可以写
uint32_t a = 0xAB; uint8_t c = a;
因为值0xAB同样可以存储在类型uint8_t的对象中。
2条答案
按热度按时间tsm1rwdh1#
C和C技术术语在这方面有点不同。我将使用C术语,但所传达的思想适用于这两种语言。
类型转换,比如那些由C风格转换和C
static_cast
生成的类型转换,是对值的操作,而不是对对象的操作,它们的结果也是值,而不是对象。操作数和结果值的 * 表示 *--包括任何特定位的值--没有被这些操作的规范所解决。因此,你的问题的基本答案是,当应用于算术类型的值时,如果目标类型可以表示操作数值,则这些操作是值保留的。
关于你的例子,你问...
我假设“较大”类型(b)的最高有效位都是零。当从位数较少的类型强制转换为位数较多的类型时,标准是否保证了这一点?
根据整数类型表示的(单独)规范,转换是值保留方法
*对于非负操作数,如果源类型和目标类型都是整数类型,并且目标类型用比源类型多的值位表示,则结果的目标类型表示中与操作数值的源类型表示中的值位不对应的值位将取值0。
*对于负操作数,如果源类型和目标类型都是(有符号)整数类型,并且目的地类型用比源类型多的值位来表示 * 以二进制补码形式 *,则结果的目的地类型表示的不对应于操作数的源类型表示中的值位的值位将取值1。
eqqqjvef2#
类型
uint8_t
是无符号整数类型因此,当此类型的对象强制转换为
uint32_t
类型时,该值将被保留,因为此类型的对象可以容纳值0xAB
。其实演员表是多余的。你可以写
你甚至可以写
因为值
0xAB
同样可以存储在类型uint8_t
的对象中。