C言語関係掲示板

過去ログ

No.613.アドレスのキャスト

[戻る] [ホームページ]
No.5879

アドレスのキャスト
投稿者---りゅう(2003/04/21 13:06:58)


お世話になります。
C言語のソースをjavaに移行しているのですが、アドレスのキャストでつまずいています。
下記のような関数で、return文のところで何を行っているのかがよくわかりません。
どなたか教えていただけないでしょうか。
またjavaでこのような処理を行う場合、どのようにしたら良いかなど教えていただければ幸いです。

unsigned float aaa(unsigned char *ptr) {
unsigned int b;

ptr += 3;

b = *ptr & 0xff;
b = b << 8;
--ptr;

b |= *ptr & 0xff;
b = b << 8;
--ptr;

b |= *ptr & 0xff;
b = b << 8;
--ptr;

b |= *ptr & 0xff;

return( *(float *)&b );
}






No.5880

Re:アドレスのキャスト(in Java)
投稿者---kikk(2003/04/21 14:38:56)


ども。


returnのところは、

// bのアドレスをもとめる(unsigned int*型)
&b

// そのアドレスにfloat型のビット列が入っているとみなすためにfloat*にキャスト
(float *)&b

// そのアドレス(float*型)の値(float型)を取り出す
*(float *)&b

というようになっています。Cプログラミングでは同じようなことを
共用体を使って実現することもあります。

Javaではアドレスを扱うことができないので意訳する必要があります。
returnの部分は、Float.intBitsToFloat()を使ってください。
引数のほうは、intかbyte[]にするとよろしいかと。


それと、

JavaFAQ
http://www.gimlay.org/~javafaq/javafaq.html

の、浮動小数のとこも参考になると思います。


では。

No.5881

Re:アドレスのキャスト
投稿者---かずま(2003/04/21 14:40:42)


unsigned flaot という型はありませんから、そのプログラムは間違いです。
おそらく、次のようなことがしたいのでしょう。
#include <stdio.h>

float aaa(unsigned char *p)
{
    unsigned int b = p[3]<<24 | p[2]<<16 | p[1]<<8 | p[0];

    return *(float *)&b;
}

int main(void)
{
    unsigned char a[4] = { 0x00, 0x00, 0x20, 0x3F };
    float f = aaa(a);

    printf("%f\n", f);
    return 0;
}
4バイトの unsigned char、すなわち 32ビットのビット列を int b に取り込み、
そのままのビット列をさらに float として解釈したい、ということでしょう。

同じプログラムを Java で書けば、
class A {

    static float aaa(byte[] p) {
        int b = (p[3]&0xFF)<<24 | (p[2]&0xFF)<<16 | (p[1]&0xFF)<<8 | p[0]&0xFF;
        return Float.intBitsToFloat(b);
    }

    public static void main(String[] args) {
        byte a[] = { 0x00, 0x00, 0x20, 0x3F };
        float f = aaa(a);
        System.out.println(f);
    }
}


No.5883

ありがとうございます。
投稿者---りゅう(2003/04/21 15:56:13)


kikkさん、かずまさんレスありがとうございました。
関数の宣言の記述が間違えていましたね。
unsigned floatではなく、static floatでした。
ご迷惑おかけしました。ありがとうございます。