2013-03-22 18 views
-3

我有一个简单而愚蠢的代码片段来分析。 它在本质上进行类似:链接分配和隐式转换的优先级

a = b = c; 

但类型是非常棘手的。
在一个地方,我有:

int a,c; 
unsigned int b; 

在其他地方,我有:

int a; 
unsigned int b,c; 

如果编译器解释A = B,然后我转换一个unsigned int到int
OK,在2补码上,无论如何,这种转换是无效的
但是这样的转换可能会溢出,这将是UB,是不是?
而在这种情况下,编译器有一个许可证来推测我不依赖UB,因此最终可以认为a> = 0,并且不再进行进一步的测试if(a<0) blah...它是对的吗?

在这种情况下,两段代码都会导致相同的行为。

如果编译器解释a = c,我认为这是做什么,如果我上面的UB分析是正确的,那么这两段代码可能会给出不同的结果。

因此,如何在这些表达解释a=ba=c,或者换言之在这种情况下,可以这样的(a<0)分支被消除,只有一个,两个或无?

最后一点,我的确切情况是内联函数的返回值,但我认为它不会超出上述结论,对吧?

static inline int a1(unsigned int *b,unsigned int c) {return *b=c;} 
static inline int a2(unsigned int *b,int c) {return *b=c;} 
+1

1.代码中没有强制转换。 2.你发布的函数除了抛出语法错误之外别无其他。 – 2013-03-22 22:47:16

+0

@ H2CO3哎呀,谢谢,我的错误 – 2013-03-22 22:51:14

回答

1
a = b = c; 

是相同

a = (b = c); 

这是你的两个例子有效。

但是这样的演员阵容会溢出,这会是UB,是不是?

没有强制转换,而是从一种类型到另一种类型的隐式转换。 将unsigned int类型的值转换为int时,如果unsigned int值在int中不可表示,则转换的结果或者是实现定义的,或者是实现定义的行为信号引发的。严格地说,这仍然不是溢出,这不是未定义的行为。

+0

这可能会引发一个有符号整数溢出异常。不过,大多数CPU不会这样做。 – 2013-03-22 22:52:11

+0

你的意思是说'int a = 1U +(unsigned int)(INT_MAX);'总是定义良好,并且编译器永远不会消除以下'if(a <0)'? – 2013-03-22 22:54:48

+0

@Loadmaster让我重新修改这个 – ouah 2013-03-22 22:54:54