如何促进操作数

时间:2012-03-09 15:49:43

标签: c promotions

我在C中有以下代码:

        int l;
        short s;

        l = 0xdeadbeef;
        s = l;

假设int是32位且short是16位,当执行s = 1时,s将被提升为32位,并且在赋值之后,只有低16位将保留在s中。我的问题是,当s被提升为32位时,额外的16位是否会被设置为0x0或0xf?

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

3 个答案:

答案 0 :(得分:2)

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

  

6.3.1.3-3

     

否则,新类型已签名且无法表示该值   在里面;要么结果是实现定义,要么是   提出了实现定义的信号。

答案 1 :(得分:0)

汇编程序有移动整个注册或部分的操作(MOV EAX, 0MOV AX, 0MOV AL, 0 - 分别为32位, 16位,8位)。由于short是16位整数MOV AX, 0形式,但这取决于编译器的实现。

答案 2 :(得分:0)

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