C++是否允许将任何整数文字隐式转换为short int?

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