Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将浮点变量分配给无符号int变量、位映像而不是强制转换_C++ - Fatal编程技术网

C++ 如何将浮点变量分配给无符号int变量、位映像而不是强制转换

C++ 如何将浮点变量分配给无符号int变量、位映像而不是强制转换,c++,C++,我知道这是一件奇怪的事情,而且它不便于携带。但我有一个分配的无符号整数数组,有时我想在其中“存储”一个浮点。我不想强制转换浮点或将其转换为最接近的等效int;我想将浮点的精确位映像存储在unsigned int的分配空间中,以便以后可以将其作为浮点检索,并保留其原始浮点值。只需重新解释相应的内存位置: float f = 0.5f; unsigned int i = *reinterpret_cast<unsigned int*>(&f); 从您的问题文本中,我假设您知道,

我知道这是一件奇怪的事情,而且它不便于携带。但我有一个分配的无符号整数数组,有时我想在其中“存储”一个浮点。我不想强制转换浮点或将其转换为最接近的等效int;我想将浮点的精确位映像存储在unsigned int的分配空间中,以便以后可以将其作为浮点检索,并保留其原始浮点值。

只需重新解释相应的内存位置:

float f = 0.5f;
unsigned int i = *reinterpret_cast<unsigned int*>(&f);
从您的问题文本中,我假设您知道,如果
float
unsigned int
的大小不相同,则会中断,但在大多数常用平台上,这两个值都应该是32位


编辑:正如Kerrek指出的,这似乎是未定义的行为。但我仍然坚持我的答案,因为它简短而精确,并且确实应该适用于任何实用的编译器(让我相信相反的观点)。但是,如果你想要一个UB免费答案,请看Kerrek的答案。

这可以通过一个简单的副本来实现:

uint32_t dst;
float    src = get_float();

char * const p = reinterpret_cast<char*>(&dst);

std::copy(p, p + sizeof(float), reinterpret_cast<char *>(&src));

// now read dst
uint32测试;
float src=get_float();
char*const p=重新解释强制转换(&dst);
标准::复制(p,p+sizeof(float),重新解释强制转换(&src));
//现在读dst

向后复制也同样有效。

如果确实需要,您可以使用
重新解释cast
。你甚至不需要像其他答案提到的那样玩指针/地址。比如说

int i;
reinterpret_cast<float&>(i) = 10;

std::cout << std::endl << i << " " << reinterpret_cast<float&>(i) << std::endl;
inti;
重新解释(i)=10;

STD::你怎么知道数组中的任意元素实际上是一个“偶然的”浮点数?如果这是你想做的事情,你可能想考虑使用<代码>联合<代码>,而不是一个显式的<代码> int <代码>,这实际上是<代码>浮点…@鲁克:使用联合几乎肯定会导致未定义的行为。
std::vector
@KerrekSB:胡说八道。除非,我想,您认为编写程序几乎肯定会导致未定义的行为。联合是将两种类型中的任何一种存储在同一内存位置的标准方法。然后,程序员有责任确保他知道存储的是哪种类型——但编写正确的代码始终是程序员的责任,因此没有任何变化。@KerrekSB当然,如果将
浮点
的原始位转换为除UB以外的
无符号整数
,您期望得到什么?一个
重新解释的演员不是几乎都是UB吗?没什么,我只是希望能回答OP的问题!;-)强制转换只有在指向char指针时才可以。正如我的姑姑Cecile所说:“如果是C++,它是指针,最好是一个字符指针!”凯瑞克,答案是?不要这样做,这是平台相关的,啊!一点也不。OP只想存储和检索,因此不依赖于平台(取决于int是否有足够的大小)。@KerrekSB啊,好的,我明白了。我同意我简短得多的答案,但你的答案是+1。我并不知道它是UB,我以为它只是依赖于平台。事实上,我想我甚至看到了Boost在Hash函数实现中的浮点(当然是在确保大小匹配之后)。TECTCICALL就我理解C++规范来说,如果你一直坚持这样做(这意味着以这种方式赋予变量ONI),那么它不是未定义的行为。只有当你直接访问这个变量时,它才是-我已经做了,但只是为了演示的目的。我不这么认为。这只是未定义的行为,仅此而已。
int i;
reinterpret_cast<float&>(i) = 10;

std::cout << std::endl << i << " " << reinterpret_cast<float&>(i) << std::endl;