C(++) short 减去 short = int?
C(++) short subtracting short = int?
有如下代码:
short a = 5;
short b = 15;
short c = 25;
short d = std::min(a, b);
short e = std::min(a, b-c); // Error
最后一行无法编译,声称没有匹配参数 "short, int" 的 min() 重载。
出现这种情况的原因是什么?
我知道 b-c 的结果可能不再适合做空。但是,如果我使用 INT,那将是相同的,并且它不会自动形成 LONG 或任何强制执行它适合的东西。
只要我确定得到的数字永远不会超过SHORT的范围,我用static_cast<short>(b-c)
就安全了,对吧?
非常感谢!
原因:整数提升。如果类型小于 int
,它会自动提升为 int
。这对有符号数没有什么影响,因为溢出是未定义的,但对于溢出回绕的无符号数,这允许编译器为大多数处理器发出更少的代码。
大多数时候,这会自动回退,因为分配给较窄的变量不是错误。不过,您碰巧发现了一个确实会导致问题的案例。
如果你确定它合适,就把它扔回去。
有如下代码:
short a = 5;
short b = 15;
short c = 25;
short d = std::min(a, b);
short e = std::min(a, b-c); // Error
最后一行无法编译,声称没有匹配参数 "short, int" 的 min() 重载。
出现这种情况的原因是什么? 我知道 b-c 的结果可能不再适合做空。但是,如果我使用 INT,那将是相同的,并且它不会自动形成 LONG 或任何强制执行它适合的东西。
只要我确定得到的数字永远不会超过SHORT的范围,我用static_cast<short>(b-c)
就安全了,对吧?
非常感谢!
原因:整数提升。如果类型小于 int
,它会自动提升为 int
。这对有符号数没有什么影响,因为溢出是未定义的,但对于溢出回绕的无符号数,这允许编译器为大多数处理器发出更少的代码。
大多数时候,这会自动回退,因为分配给较窄的变量不是错误。不过,您碰巧发现了一个确实会导致问题的案例。
如果你确定它合适,就把它扔回去。