0

我在 C 中有以下代码:

        int l;
        short s;

        l = 0xdeadbeef;
        s = l;

假设 int 为 32 位,short 为 16 位,当执行 s = l 时,s 将提升为 32 位,赋值后,s 中只保留低 16 位。我的问题是,当 s 提升为 32 位时,额外的 16 位会设置为 0x0 还是 0xf ?

来源:http ://www.phrack.com/issues.html?issue=60&id=10

4

3 回答 3

2

实际上s根本没有提升。由于s已签名并且l太大而无法放入s,因此在这种情况下将 l 分配给 s 是实现定义的行为。

6.3.1.3-3

否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么是产生实现定义的信号。

于 2012-03-09T15:53:22.160 回答
0

汇编器具有移动整个寄存器或部分寄存器的操作(MOV EAX, 0, MOV AX, 0, MOV AL, 0- 分别为 32 位、16 位、8 位)。将使用short16 位整数MOV AX, 0形式,但这取决于编译器的实现。

于 2012-03-09T16:00:58.997 回答
0

我假设您要将 s 提升为更广泛的类型。这取决于目标类型:它是有符号的还是无符号的。如果目标类型已签名,则将完成已签名的促销活动。否则 - 未签名的促销。有符号提升根据提升值的符号将高位填充 0 或 1。

于 2012-03-09T16:06:45.433 回答