我有一个代码,我取消引用字节数组指针并将值赋给变量。这适用于int和bool,但无法用于float和double类型。所以我认为我面临着一个普遍的问题。我做了一个样本:
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef unsigned char Byte;
int main( )
{
vector<Byte> v(10);
float f1 = 14.6;
copy_n((Byte*)&f1, sizeof(float), (Byte*)&v[4]);
float f2 = v[4];
float f3 = 0;
copy_n((Byte*)&v[4], sizeof(float), (Byte*)&f3);
cout << "f2: " << f2 << " f3: " << f3 << endl;
return 0;
}
std::copy_n
按预期工作,因此我必须使用它而不是f2 = v[4]
output: f2: 154 f3: 14.6
f2 = v[4]
构造有什么问题?
答案 0 :(得分:4)
float f2 = v[4]
会发生什么:float f2 = (float) v[4]
其中v[4]
是Byte
又名无符号字符。你接受那个元素(只是那个元素)并将其转换为浮动。
In v[4] you have the least significant byte of f1,
...
In v[7] you have the most significant byte of f1
它们被颠倒了,因为你的系统是小端的。
使用int
它是有效的,因为你使用的值小于128,因为系统是little-endian。即v [4]保存原始f1
的最低有效字节。与float一样,你忽略了其他3个字节,但在这种情况下(int小于128),其余字节为0,所以你看不到任何伤害。
答案 1 :(得分:2)
做的时候
copy_n((Byte*)&v[4], sizeof(float), (Byte*)&f3);
您将构成浮点f1
的所有四个字节从字节缓冲区复制回浮点数,而当您执行时
float f2 = v[4];
您只分配原始float f1
的最低有效字节,其值将隐式转换为float并分配给f2
。
通过解除指向字节数组的指针来分配值是错误的吗?
一般情况下并不常见,但这里没有意义,因为你试图从缓冲区中提取浮点数。
答案 2 :(得分:2)
f2
是float
,v[4]
是unsigned char
。
因此,您可以从v[4]
分配到f2
,但这需要进行保留值的转换。
由于您实际上想要从float
中提取v
的字节,从索引4开始,这显然是错误的。
凭借bool
和int
,您的实施工作是小端的,并且您要复制的值小于SCHAR_MAX
。
您的copy_n
- 构造可以正常工作,因为您始终可以从一个字节数组unsigned char
一次复制任何简单的可复制对象(如内置类型)。