案例1:
int8_t a = -10;
int32_t b;
b = (int32_t)a;
案例2:
uint8_t a = 10;
uint32_t b;
b = (uint32_t)a;
这两种情况会是什么?有保证吗?类型转换期间的3个额外字节是否用0?
填充澄清:更大,更多字节。
答案 0 :(得分:2)
保证整数类型之间的转换是“正确的”。也就是说,如果转换后的值(无论其类型如何)在转换后的类型中是可表示的,那么结果将是相同的值。
在第一种情况下,-10可表示为int32_t
,因此b
将最终保持-10位的32位表示。在2的补充机器(几乎所有现代计算机)上,顶部会有大量的1。在x86上,cbw
,cwd
,cwde
和cdq
指令用于执行此操作。
在第二种情况下,10可以表示为uint32_t
,因此b
将最终保持10位的32位表示。这将在顶部有大量的零。
你可以把它想象成“符号扩展” - 当扩展有符号整数时,额外的位从源操作数的MSB复制 - 但这只是实现细节。规则是,如果它可以在目标类型中表示,则它在目标类型中正确表示。
C / C ++给你的另一个保证是,当缩小无符号类型 - 从更大的无符号整数转换为更小的无符号整数时 - 结果将与斩波相同关闭高位,无论该值是否可以在较小的类型中表示。对于有符号整数,所有赌注都是关闭的(但实际上,同样的事情总是发生,有时这意味着正值变为负值)。