通过解除引用字节数组的指针来赋值是不对的?

时间:2014-12-28 09:04:00

标签: c++

我有一个代码,我取消引用字节数组指针并将值赋给变量。这适用于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]构造有什么问题?

3 个答案:

答案 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)

f2floatv[4]unsigned char

因此,您可以从v[4]分配到f2,但这需要进行保留值的转换。

由于您实际上想要从float中提取v的字节,从索引4开始,这显然是错误的。

凭借boolint,您的实施工作是小端的,并且您要复制的值小于SCHAR_MAX

您的copy_n - 构造可以正常工作,因为您始终可以从一个字节数组unsigned char一次复制任何简单的可复制对象(如内置类型)。