在C中转换为较大类型时的填充值

时间:2015-02-21 16:54:48

标签: c type-conversion posix

案例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?

填充

澄清:更大,更多字节。

1 个答案:

答案 0 :(得分:2)

保证整数类型之间的转换是“正确的”。也就是说,如果转换后的值(无论其类型如何)在转换后的类型中是可表示的,那么结果将是相同的值。

在第一种情况下,-10可表示为int32_t,因此b将最终保持-10位的32位表示。在2的补充机器(几乎所有现代计算机)上,顶部会有大量的1。在x86上,cbwcwdcwdecdq指令用于执行此操作。

在第二种情况下,10可以表示为uint32_t,因此b将最终保持10位的32位表示。这将在顶部有大量的零。

你可以把它想象成“符号扩展” - 当扩展有符号整数时,额外的位从源操作数的MSB复制 - 但这只是实现细节。规则是,如果它可以在目标类型中表示,则它在目标类型中正确表示。

C / C ++给你的另一个保证是,当缩小无符号类型 - 从更大的无符号整数转换为更小的无符号整数时 - 结果将与斩波相同关闭高位,无论该值是否可以在较小的类型中表示。对于有符号整数,所有赌注都是关闭的(但实际上,同样的事情总是发生,有时这意味着正值变为负值)。