在某种程度上,这取决于平台。在我最近的系统上,我们得到了预期的结果,可以用一个简短的程序来演示:
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint16_t var1 = 255; // 0000 0000 1111 1111
uint16_t var2 = 255; // 0000 0000 1111 1111
uint32_t var3 = (var1 << 16) + var2;
printf("%#"PRIx32"\n", var3);
}
输出是0xff00ff
。
但是,在进行任何算术运算之前,您的var1
和都会var2
进行正常的整数提升。如您所见,如果提升的类型不能保存中间结果,部分计算可能会丢失。
var1
您可以通过在算术之前显式扩展来避免该问题:
uint32_t var3 = ((uint32_t)var1 << 16) + var2;
我系统上的等效失败程序是:
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint16_t var1 = 255; // 00ff
uint16_t var2 = 255; // 00ff
uint64_t var3 = ((uint64_t)var1 << 32) + var2;
printf("%#"PRIx64"\n", var3);
}
这会产生0x1fe
而不是0xff000000ff
如果我没有var1
像所示的那样扩大演员阵容(因为在这个系统上,<<32
恰好是 32 位无符号类型的无操作)。