如何将负数转换为更宽的类型?

时间:2017-01-24 16:13:05

标签: c++ bit-manipulation

假设你有

short num = -10;
int num_casted = (int)num;
std::cout << num_casted << endl; // prints -10.  

我想知道,为什么num_casted仍然是-10而不是0xFA000000

较小型的负数如何转换为biggen?有人会开导我吗?我假设除了使用零填充可用空间之外还有一些逻辑...

2 个答案:

答案 0 :(得分:1)

假设x86 / x86-64架构具有2C编号表示。

对于有符号数,缺失位用符号位(转换后的最后一位)填充。对于无符号数,缺失位用零-s填充。

签名转换被编译为movsx指令(带符号扩展名的mov)和带movzx的无符号转换(带有零扩展名的mov)。这些指令可能有多种变体(针对不同的参数大小,SSE上的整数数学,AVX2上的整数数学等)。

答案 1 :(得分:0)

当您转换为更大的整数类型时, 应保持相同的值。不这样做是不明智的。我相信标准可以保证这一点。

在二进制补码中,在保持相同值和符号的同时将数字设置为更宽的类型非常容易 - 您只需使用符号位最初的相同值填充新的高位。对于正数,您填零,而对于负数,您只需填充。