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