我在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
并且我得到以下错误CCD_ 5。为什么?
error: invalid operands to binary &
因为f
和tmp
是浮点数,而不是整数,所以它们不能作为二进制&
的自变量。
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的加法,请注意,在十六进制浮点常量中,指数部分是必需的。
关于按位运算符(问题的第二部分),按位运算符的操作数必须是整数类型,因此不能对浮点值执行按位运算。