• ベストアンサー

Javaの型拡張について

現在、Javaの勉強をしています。 型拡張が理解できません。 以下の場合、float型(32ビット)に拡張されるようですが、 私の理解では、一番大きな型はlong型(64ビット)なので、long型だと考えています。 float型に拡張される理由を説明して下さる方お願いします。 次の式全体の型は何になるのか答えなさい。 char ch; shot s; long l; float f; f / ch - (s * l); よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

javaの言語仕様でそうなっているからでしょうか・・ 日本語訳 http://www.y-adagio.com/public/standards/tr_javalang2/conversions.doc.html#170983 最新版はこっちのようです(英語) http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.6.2

f164ex2005
質問者

お礼

ご回答ありがとうございます。 型拡張って聞いて私が勝手にビット数の多い方に拡張されると、 勘違いしただけで、Javaの仕様はご回答者様が載せてくださったリンクの通りなのですね。 仕様なら仕様で私的理解もOKです。 ありがとうございます。 以上

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 型変換

    こんにちは。 long型およびunsigned long型を unsigned char型へ変換する方法を教えてください。 例えば、long型をchar型へ変換するには sprintf(pchar, "%s", &longvalue); で可能だと思いますが、冒頭の変換は sprintfだと1番目の引数の型が違うようで うまくいきません。 よろしくお願いします。

  • strchr() の第2引数はなぜ int 型なのでしょうか

    もしかすると、ちょい前の質問(https://okauth.okwave.jp/qa4151232.html)と同じことを聞いているような気もしますが、気にせずポスト。 その質問を読んだ時に strchr() のマニュアルを見たわけなんですが、そのプロトタイプ宣言は char* strchr(const char* s, int c); なんですね。どうして第 2 引数の型が int なのでしょう?「文字」c を検索するんだから普通に考えれば char ではないかと思うのですが、誰か教えて下さい。 ソースはこんな感じだったので、int である必要はないように思えるのですがどうなんでしょうか? 負数を与えたときに「何らかの動作」を期待してのことなのでしょうか? char* strchr(const char* s, int c) {  char ch;  ch = c; /* <= 結局 char 型にしている */  for ( ; ; ++s) {   if ( *s == ch ) {    return (char*)s;   }   if ( *s == '\0' ) {    return NULL;   }  } }

  • 変数 および ポインタのサイズ(バイト数)について

    sizeof演算子を使ってchar int float double型のバイト数を調べると、char 型については1バイトと決まっていて、int float doubleについては2から8バイト(処理系によって違う)なのは理解できます。しかし、char* int* float* double*型(ポインタ型)のバイト数は2から4バイトになるのが多いとおもいますが、どういう理由でポインタ型のバイト数が決まるのか、その理由をお教え願いたく思います。16ビットcpuあるいは32ビットcpuと言うハードの影響なのかそれとも何かソフトによるのか、その理由を知りたいと思います。なお私の処理系ではポインタは全て4バイトになっています。特に不思議に思うのはchar型は1バイトなのに、char*型が4バイトになっていることです。 宜しく願います。

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • float 型のデータのメモリ上での理解の仕方

    詳しい方教えていただけると助かります。 OS:LINUX コンパイラ:GCC 以下のプログラムを実行し、結果ファイルの test.txt を od で見ると 期待した通りの結果になりません。long 型や、short型は期待通りの結果になるのですが。  どういうロジックを経て、以下のような数値になっているのでしょうか?変換ロジック等がわかるとありがたいのですが・・・。 #include <stdio.h> main() { float f; char line[4]; FILE *fp; f = 1234; memcpy(&line[0], &f, sizeof(float)); fp = fopen("test.txt", "w"); fputc(line[0], fp); fputc(line[1], fp); fputc(line[2], fp); fputc(line[3], fp); fclose(fp); } test.txt 内容を od した結果の数値 0000 c000 8c29 4167

  • 文字列リテラルの比較について

    下記のプログラムの疑問点を教えて頂きたい。 (1)mainの実引数(ch[0]は、str_chr関数を呼ぶ場合、intの型変更する理由、 (2)cをキヤストしてchar 型変更した後、再度int C に代入する理由 (3)char型*Sとint 型Cでは、型が違うのに何故比較できる理由 char *str_chr(const char *s, int c) { c = (char)c; while (*s != c) { } main { char ch[2]; str_chr(G,ch[0]) main {

  • 文字を整数として扱う場合の演算について質問

    javaの参考書に、文字を整数として扱う場合の演算についての解説があり、疑問点があったので質問します。 質問1:何故char型の変数は、キャストしなくてもint型のリテラルを代入することができるのか?      例えば、 以下の演算はキャストしなくてもこのまま代入できます。 char ch='a'; ch=98; でも、以下の演算はキャストしていないのでエラーになります。      char ch='a'; ch=ch+1; これは何故ですか?参考書に記載されていた理由として、「byte,char,short、 これ等の型の変数や値を使って計算すると、それ等は一度intに直して計算されるから」というような趣旨の事が書いてありました。 つまり、char型の変数には、キャストしない限りint型の数値を代入できないということですよね? でも前者のソースコードは、chはchar型であるにもかかわらず、int型のリテラル98を代入できています。 これは何故ですか? 質問2:javaの参考書に、インクリメント・デクリメント演算子と複合代入演算子は、型を保存するという解説がありました。これはどういう意味ですか? 僕の仮説では、例えば、      char ch='a';      ch+=5; であれば、5は、char型のまま代入されるということでしょうか?

    • ベストアンサー
    • Java
  • Aviutl+拡張x264出力の音声部分について

    よろしくお願いします。 Aviutlの拡張x264出力を使って動画をエンコードしたとき、 仕上がった動画には特に問題(音ズレ等も発生しない)がなかったのです。 しかし出来たmp4ファイルを真空波動研で見てみると  704x396 24bit AVC/H.264 Main@3 30fps 34763f 1023.88kb/s AAC 48.00kHz 2.0ch(2/0 L+R) HE 310.74kb/s となっていました。 ここでの問題は、AAC HEになっていることです。 ピアノの動画なので出来たらAAC LCでエンコードしたいので再度設定をしなおし再エンコード。 しかし、出来上がったものはAAC HEになっていました。 拡張x264出力の音声設定ではAAC LC ***を確実に選んでいます。 なにか特別な設定が必要なのでしょうか? お分かりの方が居られましたら、どんなことでもかまいませんので教えてください。 AACへのエンコードには neroAacEnc.exe を使っています。

  • アドレスから値を求める

    Cのアドレスで悩んでいます。 long adrBuf[4]の配列に、アドレスが入っています。 そして、 adrBuf[0]には、float型データのアドレス adrBuf[1]には、short型データのアドレス adrBuf[2]には、float型データのアドレス adrBuf[3]には、char型データのアドレス となっています。 以下のような、ことをしたいのですが、右辺の記述が わかりません。教えて下さい。 float f1 = adrBuf[0]のアドレスの値を代入 short s1 = adrBuf[1]のアドレスの値を代入 float f2 = adrBuf[2]のアドレスの値を代入

  • 'const char *' 型は 'char *' 型に変換できない ??

    Case 1 Text9.Text = "AB"; Text10.Text = "A"; // 1文字目 Text11.Text = "B"; // 2文字目 case 2; Text9.Text = "Ab"; Text10.Text = "A"; Text11.Text = "b"; case 3; Text9.Text = "aB"; Text10.Text = "a"; Text11.Text = "B"; case 4; Text9.Text = "ab"; Text10.Text = "a"; Text11.Text = "b"; 上記のようなCase 文を C を使って作成したいのですが, A~J の大文字とa~jまでの小文字をつかって,2文字の文字列をつくるとき, 1文字目と2文字目が,形態も名称も異なる文字列(例 AB , Ab aB, ab, AC, Ac aC ac, ...)のcase文をつくりたいのですが, 'const char *' 型は 'char *' 型に変換できないというエラーメッセージがでてしまいます.下記プログラムをどう直せばいいかおしえてください. #include <stdio.h> #define MAX_NAME 256 int main(void) { const char *NAME12 = "Text9"; const char *NAME1 = "Text10"; const char *NAME2 = "Text11"; const char *ALPH = "ABCDEFGHIJabcdefghij"; FILE *fp = NULL; char f_name[MAX_NAME]; int count = 0; char *p = ALPH; char *q = ALPH; printf("ファイル名:"); scanf("%s", f_name); fp = fopen(f_name, "w"); if (fp == NULL) { printf("'%s':ファイルが見つかりません\n", f_name); } else { for (p = ALPH; *p != '\0'; p++) { for (q = ALPH; *q != '\0'; q++) { if (*p != *q) { count++; fprintf(fp, "Case %d\n", count); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME12, *p, *q); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME1, *p, *q); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME2, *p, *q); } } } fclose(fp); } return 0; }