【发布时间】:2020-02-20 23:46:04
【问题描述】:
我有这段代码
#include <stdio.h>
typedef signed long long v2signed_long
__attribute__ ((__vector_size__ (sizeof(signed long long) * 2)));
int main()
{
v2signed_long v = {4611686018427387904LL, -9223372036854775808LL};
printf("%lli, %lli\n", v[0], v[1]);
return 0;
}
给出以下警告(相关问题没有帮助):
:7:45: warning: integer literal is too large to be represented in
a signed integer type, interpreting as unsigned
[-Wimplicitly-unsigned-literal]
v2signed_long v = {4611686018427387904LL, -9223372036854775808LL};
有没有办法解决这个警告?谢谢!
【问题讨论】:
-
没有真正检查我认为@Eljay 是正确的值。 (对我来说)令人惊讶的背景是
-1不是整数文字,而是一个常量表达式,由整数文字1和一元减号运算符组成,正如人们所期望的那样,符号反转。现在,正整数文字9223372036854775808(稍后应用一元减号)对于 long long 值空间来说确实太大了,解决方案正是 Eljay 所说的:使用最大的正整数,反转它的符号,并减一。仍然是编译时表达式,所以没有坏处。 -
C 是一种邪恶的语言。 当然
-9223372036854775808LL是一个正数,因此-:) 或者您可以将其移植到 1 的补码计算机上,这也可以解决问题 :) -
又一个解决方案:
(int64_t) -0x8000000000000000。当 C 变坏时,以同样的方式回应!