c-整型常量对于其类型来说太大,并将无效操作数与二进制运算符进行AND运算



我在64位计算机中使用double longsizeof(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

并且我得到以下错误CCD_ 5。为什么?

error: invalid operands to binary &

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

long double f = 0xA0000000000000000000000000000000

您正在使用整数常量初始化浮点变量。这本身是可以的,但整数常量有自己的类型,只能和最大的整数类型一样大(编译器选择适合的类型)。如果编译器上最大的整数类型小于128位,这将不起作用。

CCD_ 9并不意味着CCD_。

扩展我的评论:

long double是浮点类型。这就是为什么你不能对它们进行逐位运算的原因。

不幸的是,该标准不能保证128位整数类型。据我所知,唯一一个真正支持它作为扩展的编译器是通过__int128的GCC。(编辑:它看起来并不总是支持它。)

MSVC也有__int128类型,但它仍然只是保留的,没有实现。

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

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

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

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

可以。

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

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

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

最新更新