【问题标题】:Expression with signed and unsigned ints带符号和无符号整数的表达式
【发布时间】:2014-11-04 00:48:46
【问题描述】:

当添加有符号和无符号值时,我们遵循这两条规则(来自https://stackoverflow.com/a/2280810/1073672

否则,如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。

否则,如果有符号整数类型的操作数的类型可以表示无符号整数类型的操作数的所有值,则将无符号整数类型的操作数转换为有符号整数类型的操作数的类型输入。

将触发上述哪些规则:

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

【问题讨论】:

标签: c


【解决方案1】:

常量532的类型是int,是有符号的。

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

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

【讨论】:

  • 符合要求的实现可以使int 的范围成为unsigned int 范围的子集。 int 的符号位必须是 unsigned int 的填充位。对于仅对有符号整数具有硬件支持的系统,这可能是合理的。 (我知道现实生活中没有这样的当前系统。)
猜你喜欢
  • 2014-10-15
  • 1970-01-01
  • 2013-11-11
  • 2011-04-09
  • 2015-09-14
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多