整数常量对于其类型而言太大而对二元运算符的操作数无效

时间:2012-02-13 11:31:58

标签: c binary long-integer long-double binary-operators

我在64位计算机上使用double long,而sizeof(double long)16 bytes。 所以我做了以下任务:

  long double f = 0xA0000000000000000000000000000000; // 32 characters in hex

我收到此警告:warning: integer constant is too large for its type。这个警告似乎不正确,我的常数可以很容易地保存在128位值。那么,为什么我会收到警告?

我也有这段代码:

  long double tmp = 0x90000000CCCCCCCC0000000000000000;
  long double res = (f & tmp);  // where f is the previously defined variable

我收到以下错误error: invalid operands to binary &。为什么?

3 个答案:

答案 0 :(得分:2)

error: invalid operands to binary &

因为ftmp是浮点数而不是整数,所以它们不能作为二进制&的参数。

long double f = 0xA0000000000000000000000000000000

您正在使用整数常量初始化浮点变量。这本身就可以,但是整数常量有自己的类型,它只能与你拥有的最大整数类型一样大(编译器选择适合的类型)。如果编译器上的最大整数类型少于128位,则无效。

BTW sizeof(double long) == 16并不意味着long double有128位表示。

答案 1 :(得分:1)

扩展我的评论:

long double是一种浮点类型。这就是为什么你不能对它们进行逐位操作。

不幸的是,该标准不保证128位整数类型。我知道的唯一的编译器实际上支持它作为扩展名为GCC via __int128。 (编辑:它看起来并不总是支持它。)

MSVC也有__int128类型,但它只保留并且未实现。

如果您只进行逐位操作,则可以使用具有两个64位整数的结构。或者,如果您使用的是x86,则可以使用128位SSE数据类型。

答案 2 :(得分:1)

0xA0000000000000000000000000000000是一个整数常量,根据您的系统,它可能不受支持。整数常量的较大类型为unsigned long long,如果系统中unsigned long long的宽度为64位,则此常量将不适合。

你可以做的是使用十六进制浮点常量而不是十六进制整数常量。

long double f = 0xA0000000000000000000000000000000p0L;
                                                  ^^ the exponent is 0

没问题。

p引入了指数(必填),L表示它是long double文字(默认为double)。

十六进制浮点常量是C99的加法,请注意,在十六进制浮点常量中,指数部分是必需的。

关于按位运算符(问题的第二部分),按位运算符的操作数必须是整数类型,因此不能对浮点值执行按位运算。