• ベストアンサー

自動変換について質問

javaの解説書に、「shortはビット幅がcharより狭いので、charからshortに変換できない」と書いてありました。 これは、正のbit幅が、charが16でshortが8だから、charよりshortのほうがbit幅が狭いから自動変換できないということですか?

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

「shortはビット幅がcharより狭いので、charからshortに変換できない」 これもいろいろ誤解を呼びそうな表現だなぁ charは16bit符号なしで10進にして0~65535(2の16乗-1)の値を表現できる。 shortは16bit符号ありで10進にして-32768((-1*2の15乗)~32767(2の15乗-1)の値を表現できる。 32767~65535がshortでは表現できないので自動変換はできない、というのはあきらか。 「正のbit幅」なんてものは無い。あえて言えば、正の最大値から[15bit]と言える。8bitではない。

wantanton
質問者

お礼

厳密で本質的な御回答ありがとうございます! 参考になります!

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

もっとシンプルな話で バケツの水はコップに入りきらない ってことよ。 バケツ(char)に浮かんでいる浮き(データ)を コップ(short)に入れる(変換)には ざばっとひっくり返した(自動)だけじゃ入らない。 コップですくいにいったり、別の何かですくってあげたりしないといけないのよね。

wantanton
質問者

お礼

シンプルな御回答ありがとうございます! 参考になります

関連するQ&A

  • 自動変換について質問

    僕はプログラミング初心者ですので、それを念頭に置いた上でわかりやすく且つ本質的なご教示希望します。よろしくお願いします^^ 参考書に「byte、shortはビット幅がcharより狭いのでcharからこれらの型には自動変換できない」と書いてありました。byteはcharよりビット幅が狭いから納得できるのですが、shortとcharのビット幅は同じ16です。なんで自動変換できないんですか?ビット幅が同じなのに、、

    • ベストアンサー
    • Java
  • 数値を2進数文字列に変換するものなんですが・・・

    数値を2進数の文字列に変換するプログラムを関数として作成しているんですが、わからないことがあるのでお願いします。 char *itob(int value, int size, char binary[]) { int count = 0; /* binaryの添え字 */ int bit = size * 8; /* ビットになおす */ int mask = 1 << bit - 1; /* 先頭ビットに1を立てる */ /* 数値を2進数の文字列に変換する処理 */ do { if(value & mask) { /* valueとmaskのAND(論理積) */ binary[count] = '1';/* '1'を代入 */ }else { binary[count] = '0';/* '0'を代入 */ } value <<= 1; /* valueを左へ1ビットシフト */ count++; /* countを1たす */ }while(count < bit); /* 繰り返しを行う条件 */ binary[count] = '\0'; /* 最後に'\0'を入れる */ return binary; /* 変換した値を戻り値として返す */ } この前にもプログラムがありますが、コンパイルして実行する際に 10001 1110 と入力したら、 11111 という答えを出したいのですが、 これを実行すると、 00000000000000000000000000011111 となってしまいます。 これを11111とするためにはプログラムにどのような処理をすればよいのかわかりませんのでどなたかおわかりのかた解説をお願いします。

  • 暗黙的型変換

    C の文法書を読んでいると、 汎整数型拡張: int より小さな汎整数型が式中に現れる場合は、暗黙的に int 型に変換される。 算術変換: 二項演算子で二つのオペランドの型が違う場合は、演算前により大きな方の型に暗黙的に変換される。 とあります。 例えば int 型 = unsigned short 型 - unsigned char 型; はどのように暗黙的な型変換が行われるのでしょう。 int 型 = (int)unsigned short 型 - (int)unsigned char 型; でしょうか。あるいは、 int 型 = (int) ( unsigned short 型 - (unsigned short)unsigned char 型); でしょうか。

  • C言語の型変換について

    short int 型をunsigned char型に変換する方法をおしえてください

  • 1bppファイルを8bpp(raw)に変換する。

    環境 Windows7 VS2008 SP1 1bppの画像を8bppに変換しようとしているのですが うまくいきません。自分ではこれで 合っていると思うのですが・・・ 何かアドバイスお願いしますm(__)m int Main1bppTo8bpp(WCHAR *filename,int width,int height) { //width,heightは8bppになったときの幅,高さを指定する。 FILE *fpt; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK); return -1; } else { unsigned char *layer,*Output; layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char)); Output=(unsigned char*)malloc(width*height); //読み込み fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt); FILE *fpt_output; _wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb"); int i,j,flag=0x00; for(i=0;i<((width/8)+1)*height;i+=((width/8)+1)) { for(j=0;j<((width/8)+1);j++) { //8bit目 if((layer[i+j]&BIT8)==BIT8) { Output[i+j+flag]=0x00; } else { Output[i+j+flag]=0xff; } //7bit目 if((layer[i+j]&BIT7)==BIT7) { Output[i+j+flag+1]=0x00; } else { Output[i+j+flag+1]=0xff; } //6bit目 if((layer[i+j]&BIT6)==BIT6) { Output[i+j+flag+2]=0x00; } else { Output[i+j+flag+2]=0xff; } //5bit目 if((layer[i+j]&BIT5)==BIT5) { Output[i+j+flag+3]=0x00; } else { Output[i+j+flag+3]=0xff; } //4bit目 if((layer[i+j]&BIT4)==BIT4) { Output[i+j+flag+4]=0x00; } else { Output[i+j+flag+4]=0xff; } //3bit目 if((layer[i+j]&BIT3)==BIT3) { Output[i+j+flag+5]=0x00; } else { Output[i+j+flag+5]=0xff; } //2bit目 if((layer[i+j]&BIT2)==BIT2) { Output[i+j+flag+6]=0x00; } else { Output[i+j+flag+6]=0xff; } //1bit目 if((layer[i+j]&BIT1)==BIT1) { Output[i+j+flag+7]=0x00; } else { Output[i+j+flag+7]=0xff; } flag=flag+8; } flag=0x00; } //最終的な「fwrite」はここでする。 fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output); free(layer); free(Output); fclose(fpt); fclose(fpt_output); } return 0;

  • char型からアスキーコードへの変換

    Javaでchar型配列に入っている文字をアスキーコードに変換する方法をご教授ください。

    • ベストアンサー
    • Java
  • WORDをcharに変換する方法

    MFCデータ型のWORD(C言語のunsigned(signed)short)の値を)char型に変換する方法をご存知の方がいらっしゃったらお願いします。

  • PCMをWAVに変換

    PCMをWAVに変換 24bit 48khzのPCMを作業を重ねてでもいいので、最終的に16bit 48khzのWAV音声にしたいです。 「PCM WAV 変換」などで検索して出てくるソフトを片っ端から試してみましたが、どれも読み込めないか、変換できないか、できたとしてもノイズだらけかでした。 できることならフリーソフトで何とかしたいところですが、この作業だけで20時間以上費やしているので、数千円程度ならば惜しみなく出すつもりです。 くどいようですが、 " 24bitのPCM " データを " 16bitのWAV " に変換する方法です。 これならば確実に変換できるというソフトを知っている方、回答よろしくお願いします。 ちなみにOSはWindows VISTAです。

  • 8kHz、8bitのwavに変換したい。

    Audacity Ver2.0.0 で8kHz,8bitのwavファイルを作成しようとしたのですが、ビットは16bitまでしか落とせないようで困っています。 44.1kHz 32bitのwavファイルを8kHz,8bitに変換する方法はAudacityにはあるのでしょうか? ご存じの方いらっしゃいましたら、ご教授よろしくお願いします。

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

    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