我想了解C ++语言标准规定的规则,例如:
long x = 200;
short y = static_cast<short>(x);
y
是否保证为200,或标准是否由实施决定?各种编译器如何符合标准?
答案 0 :(得分:9)
在这种情况下,static_cast<>
是'显式类型转换。该标准对4.7 / 3“积分转换”中的积分转换有所说明:
如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改;否则,该值是实现定义的。
由于short
保证能够保存值200
(short
必须至少为16位),因此对于您的具体示例,答案是肯定的。
各种编译器都很好地遵循这种行为 - 自从ANSI之前的C版以来就是这样,而且代码很多依赖于编译器供应商似乎不愿意发出关于截断可能性的警告的行为。
答案 1 :(得分:-2)
如果该值落在short
的范围内,那么该值保证是正确的,在您的情况下为真,那么y == 200
。
如果它落在外面(例如static_cast<short>(1000000000)
),则行为未定义。大多数编译器只会将二进制数字截断为正确的大小。