我在C中有以下代码:
int l;
short s;
l = 0xdeadbeef;
s = l;
假设int是32位且short是16位,当执行s = 1时,s将被提升为32位,并且在赋值之后,只有低16位将保留在s中。我的问题是,当s被提升为32位时,额外的16位是否会被设置为0x0或0xf?
答案 0 :(得分:2)
实际上s
根本没有提升。由于s
已签名且l
太大而无法容纳s
,因此在这种情况下将l分配给s是实现定义的行为。
6.3.1.3-3
否则,新类型已签名且无法表示该值 在里面;要么结果是实现定义,要么是 提出了实现定义的信号。
答案 1 :(得分:0)
汇编程序有移动整个注册或部分的操作(MOV EAX, 0
,MOV AX, 0
,MOV AL, 0
- 分别为32位, 16位,8位)。由于short
是16位整数MOV AX, 0
形式,但这取决于编译器的实现。
答案 2 :(得分:0)
我假设你要将s推广到更广泛的类型。 这取决于目标类型:是签名还是未签名。如果目的地类型已签名,则将完成签名促销。否则 - 未签名促销。签名促销根据提升值的符号将较高位填充0或1。