2014-11-04 47 views
2

将已签名的时候和无符号的值,我们遵循这两个规则(从https://stackoverflow.com/a/2280810/1073672表达的符号和无符号整数

否则,如果具有无符号整型操作数的秩大于或等于的秩另一个操作数的类型,则带符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则将具有无符号整数类型的操作数转换为带有符号的操作数的类型整数类型。

其中上述规则将被触发:

unsigned int ui = 4; 
ui = ui + 532; 
+0

看看http://stackoverflow.com/a/5563063/4115244! – Blackhat002 2014-11-04 01:38:13

+0

http://stackoverflow.com/questions/21627665/implicit-conversion-confusion-between-signed-and-unsigned-when-reading-kr-book看看@这 – 2014-11-04 04:15:09

回答

2

类型不断532的是int,这是签署。

看看第一条规则,由于unsigned intint具有相同的等级,所以无符号类型的等级大于或等于有符号类型的等级。第一条规则匹配。在添加之前,签署的532转换为unsigned int

即使第一条规则不匹配,添加也不能匹配第二条规则,因为有符号的int不能代表unsigned int的所有值。 (有相同数量的可能的签名int S作为unsigned int S,但是,例如,-1是签名int但不是一个unsigned int,因此必须有至少一个unsigned int不能被表示为带符号int。)

+0

@MattMcNabb谢谢,改变它。 – 2014-11-04 12:39:02

+1

符合的实现*可以*将int的范围作为'unsigned int'范围的一个子集。 'int'的符号位必须是'unsigned int'的填充位。对于只有硬件支持有符号整数的系统来说,这可能是合理的。 (我知道现实生活中没有这样的现有系统。) – 2014-11-04 17:02:49

相关问题