xml*_*lmx 11 c++ integer type-conversion literals integer-promotion
int main()
{
short n1 = 8ll; // no warning
// warning C4305: 'initializing': truncation from '__int64' to 'short'
// warning C4309: 'initializing': truncation of constant value
short n2 = 88888ll;
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是Visual Studio 2017.
根据cppref:
整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和哪个整数后缀.
带后缀的整数文字ll应为long long int; 所以short n1 = 8ll应该触发像short n2 = 88888ll这样的警告.
如果C++ short int足够小,C++是否允许将任何整数文字隐式转换为a ?
Bau*_*gen 20
该标准允许任意两种整数类型之间的隐式转换,无论它们的值如何.
编译器警告与合法代码无关; 当您的代码可能没有按照您的意愿执行时,编译器会发出警告.
在您的特定情况下,n1将为8并且n2将具有实现定义的值.这两个作业都是合法的C++,但后者可能不是你想要的.
相关标准:
可以将整数类型的prvalue转换为另一个整数类型的prvalue.可以将未范围的枚举类型的prvalue转换为整数类型的prvalue.
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断).- 结束注释]
如果目标类型是有符号的,如果它可以用目标类型(和位字段宽度)表示,则该值不变; 否则,该值是实现定义的.
N4141中的4.7/1-3