Oracle Solaris Studio 12.2 发行版的新增功能

更正大型十进制整型常量的解释

C++ 标准规定,无后缀的十进制整型常量当作 int 处理(如果值符合 int),否则当作 long int 处理。如果值不符合 long int,结果将不确定。

在 32 位模式中,类型 intlong 具有相同的大小和数据范围。C++ 编译器遵循 1990 C 标准规则,将 INT_MAX+1 和 LONG_MAX 之间的值当作无符号的 long 处理。这种处理在某些程序中会产生意外的结果。

1999 C 标准更改了无后缀的十进制整数的规则,这样它们就永远不会被当作无符号的类型来处理。类型为 intlonglong long 中第一个可以表示值的类型。

C++ 编译器在标准模式中遵循 C99 规则,但在 -compat=4 模式中继续遵循 C90 规则。(在 -compat=4 模式中,编译器的行为类似于 C++ 4.2 编译器。)

如果您希望大型十进制整数被当作无符号的整数,则简便的解决方法是使用 uU 后缀。同样,可以对其他类型使用其他后缀。例如:


              // note: 2147483648 == (INT_MAX+1)
              2147483648     // (signed) long long
              2147483648LL   // (signed) long long
              2147483648U    // same as 2147483648u