0x0000FFFFFFFFFFFFLL做了什么

wic*_*cky 1 c c++

我看过他们使用的一些代码'0x0000FFFFFFFFFFFFLL'.我不知道它做了什么.有人可以解释一下这段代码的作用.

int64 l1;
l1 = *(Int64 *)&d1 & 0x0000FFFFFFFFFFFFLL;
Run Code Online (Sandbox Code Playgroud)

虽然这不适合'stackoverflow'但我无处可寻.我是编程新手,请帮忙.

pax*_*blo 6

0x0000FFFFFFFFFFFFLLlong long intC和C++中的常量,保证具有一定的最小值范围,用于处理比通常使用的数字更大的数字intlong (a).

在这种特殊情况下,除了最右边的48(每个F是4位)之外,它设置为零.

至于它为什么这样做,它几乎,但不完全(基于变量名称和你在注释中提到d1double变量)一段代码,它给你一个double(IEEE754双精度)变量的小数位.

根据IEEE754-1985维基百科页面,64位值的结构如下:

在此输入图像描述

十二位是符号和指数所以,如果它是0x000FFFFFFFFFFFFFLL(十三F位而不是十二位),那可能就是原因.但是,除非你在输入值时犯了错误,否则它的可能性就会降低.如果没有进一步的情况下,这将是很难确定什么样的总体目标(而不是效应).

对于按位运算符(例如&,按位运算AND符)的精度,请参阅此堆栈溢出答案.


(a)从技术上讲(至少对于C来说),它只需要至少与a一样"宽"(就位而言)long(反过来,只需要至少与a一样宽int).实际上,它们可以具有相同的大小,同时牢记long long必须能够存储范围内的数字+/- 9,223,372,036,854,775,807(7fffffffffffffff以十六进制表示)的要求,因此可以轻松地保持给定的常量.