signed long long value = -2147483648;
cout << ((signed long long)value);
输出2147483648(没有减号),为什么?
答案 0 :(得分:8)
signed long long value = -2147483648;
2147483648
不能用32位有符号整数表示,因此它被转换为无符号,然后应用一元减号(它不会改变任何东西),然后将它分配给有符号长整数长。使用-2147483648LL
答案 1 :(得分:1)
C ++中的文字整数的类型为int
。如果它不适合该类型,则可以将其解释为无符号整数。但是,不能保证它会自动被视为更大的整数类型。
幸运的是,标准支持后缀表示法来指定文字的显式类型。
在这种情况下,您应该使用-2147483648LL
。
答案 2 :(得分:0)
您的原始代码可能包含未定义的行为,但它看起来像 更像是编译器错误给我。正如其他人所指出的那样 常量2147483648不能用32位int表示。 根据标准,“整数字的类型 取决于其形式,价值和后缀。如果它是十进制的并且有 没有后缀,它具有其中第一个类型的值 可以表示:int,long int;如果价值不能 表示为long int,行为未定义。“ 草稿C ++ 0x在这些结尾添加了很长的时间。
如果LONG_MAX大于2147483648,则表示类型 字面值很长,减号应该给出正确的值。 否则,如果编译器已经支持long long(并且从那以后) 你要声明这种类型的变量,必须假设 它确实如此),2147483648的类型很长,而且是负数 应该给出正确的价值。如果编译器不支持 long long,long只有32位,那么你的代码就有了 未定义的行为,因此编译器所做的任何事情都是“正确的”。