我在 C 中有以下代码:
int l;
short s;
l = 0xdeadbeef;
s = l;
假设 int 为 32 位,short 为 16 位,当执行 s = l 时,s 将提升为 32 位,赋值后,s 中只保留低 16 位。我的问题是,当 s 提升为 32 位时,额外的 16 位会设置为 0x0 还是 0xf ?
我在 C 中有以下代码:
int l;
short s;
l = 0xdeadbeef;
s = l;
假设 int 为 32 位,short 为 16 位,当执行 s = l 时,s 将提升为 32 位,赋值后,s 中只保留低 16 位。我的问题是,当 s 提升为 32 位时,额外的 16 位会设置为 0x0 还是 0xf ?
实际上s
根本没有提升。由于s
已签名并且l
太大而无法放入s
,因此在这种情况下将 l 分配给 s 是实现定义的行为。
6.3.1.3-3
否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。
汇编器具有移动整个寄存器或部分寄存器的操作(MOV EAX, 0
, MOV AX, 0
, MOV AL, 0
- 分别为 32 位、16 位、8 位)。将使用short
16 位整数MOV AX, 0
形式,但这取决于编译器的实现。
我假设您要将 s 提升为更广泛的类型。这取决于目标类型:它是有符号的还是无符号的。如果目标类型已签名,则将完成已签名的促销活动。否则 - 未签名的促销。有符号提升根据提升值的符号将高位填充 0 或 1。