-6

配列 t1 が空である理由がわかりません。私が知っているように、memcpy はオブジェクトの基になる型を気にするべきではありません。どう思いますか?%)

cout << sizeof(float) << sizeof(int) << endl;

float *t1= (float *)malloc(20*sizeof(float));
memset(t1,0x00,20*sizeof(float)); 

int *t2= (int *)malloc(20*sizeof(int));
for (int i=0; i<20; i++) 
    t2[i]=i;  

memcpy(t1,t2,20*sizeof(int));

for (int i=0; i<20; i++) 
    printf("%f\t", (float)t1[i]); 

型キャストの意味を知っています。わかりました、私は少し間違いをしました。不注意でした!

PS memcpyの仕組みを理解するためのサンプルでした!!

4

6 に答える 6

4

この関数memcpyはビットを逐語的にコピーします。したがって、整数配列から浮動小数点配列にビットをコピーしています。内容が浮動小数点表現と一致する可能性はほとんどありません。したがって、浮動小数点形式にはほとんど意味をなさないもので満たされた配列が得られます。

一言で言えば、最低レベルでは、大きく異なっ1て見えます。1.0f


キャスト(float)t1[i])は実際には何もしませt1[i]float

于 2012-08-24T08:05:46.030 に答える
3

あなたの抗議にもかかわらず、あなたの配列は「空」ではありません。非常に小さな値を保持しているだけです。あなたのマシンは、浮動小数点を表すために IEEE754 標準を使用しています。その標準では、すべてゼロの単語は値 0.0 を表します。次に大きいワード (つまり、基になるビットに 1 を追加することによって得られるワード) は、次に大きい浮動小数点値を表します。これは、非常に小さな非正規値です。このprintf値を標準精度 (小数点以下 6 桁?) にすると、ゼロに丸められます。

これは、同様の質問に対する私の接線関連の回答です。

于 2012-08-24T08:09:58.267 に答える
1

intとfloatではビットの並びが違います。うまくコピーできても理解できません。

への変更

for (int i=0; i<20; i++) 
  printf("%d\t", (int)t1[i]);

コピーされたものが表示されます。

于 2012-08-24T08:10:48.660 に答える
1

整数値 0、1、2、3、4、5 .. 20 を float に強制しています。float と int は異なる基になる表現を使用します。率直に言って、これらの値は非常に小さいため、形式を変更して多くの精度を含めない限り、0 として出力されると思います。

于 2012-08-24T08:09:57.307 に答える
0

C++ を使用しているので、代わりに C++ 機能を使用できます。std::vector

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
int main(){
    cout << sizeof(float) << sizeof(int) << endl;
    std::vector<float> floatVector;
    std::vector<int> intVector;

    for (int i = 0; i < 20; i++)
    {
        intVector.push_back(i);
    }
    floatVector.resize(intVector.size());

    std::copy(intVector.begin(), intVector.end(), floatVector.begin());
    for (int i = 0; i < 20; i++)
    {
        cout << "element[" << i << "]: " << floatVector[i] << std::endl;
    }
}
于 2012-08-24T08:34:12.497 に答える
0

memcpy はメモリをバイトとしてコピーし、メモリの場所に格納されている基本的な型は気にしません。メモリ内の整数は浮動小数点数とは異なる形式で格納されるため、基本的に t1 になるものは有効な浮動小数点値である可能性がありますが、必ずしも有効な浮動小数点値である必要はありません。

于 2012-08-24T08:09:39.017 に答える