• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:(1)~(3)に文法、解釈に間違いはございますか?)

(1)~(3)に文法、解釈に間違いはございますか?

このQ&Aのポイント
  • bの内容をuchar型に変更(上位8ビットをカット)して、その値をaに代入する。
  • bの内容をuchar型に変更(上位8ビットをカット)して、その値を右へ8ビットシフトして、その後の値をaに代入する。
  • bの内容を右へ8ビットシフトして、その値をuchar型に変更して、その後の値をaに代入する。

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

uchar,uintは,どこかで定義されているとしても,外部の者には,その中味がわからないので,(1)~(3)に文法、解釈に間違いがあるかどうかはなんともいえません。 もし,これが,unsigned char,unsigned intなら,つぎのようでしょう。 あなたの使っている環境がどういうものかわかりませんが,よほど古くて,16bit環境なら,intのサイズは2Byte,charのサイズは1Byteでしょう。しかし,いまどきは32bit以上のシステムなので,intのサイズは4Byte=32bit以上,charのサイズは1Byte=8bit が普通です。sizeof()で調べましょう。 とすると, (1) (unsigned char)bにキャストすると,bは8bitになりますが,カットされるのは上位24bitです。 (2) 8bitのbを8bit右シフトすると,7bitシフトしたところで,bの元データはなくなってしまうので,a=(unsigned char)b>>8;で,コンパイル時,警告が出るかもしれません。 (3) int型bを8bitシフトしてchar型にするので,特に問題ないと思われます。 こんなものは,実際に実行して自分で確かめましょう。 たとえば,void main(void) { unsigned char a; unsigned int b; b=65; a=(unsigned)b; printf("a=%c b=%d\n",a,b); a=(unsigned char)b>>7; printf("a=%d b=%d\n",a,b); a=(unsigned char)(b>>1); printf("a=%d b=%d\n",a,b); } のようなことでどうでしよう。

ron_nast
質問者

お礼

ご回答ありがとうございます。 色々とご説明を頂き、大変参考になりました。 >こんなものは,実際に実行して自分で確かめましょう。 そうですね。 早速自分で確認致します。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

uchar や uint が定義されていないのですべてアウト. よしんば typedef unsigned int uint; typedef unsigned char uchar; という定義が隠れていたとしても, (1) や (2) における「bの内容をuchar型に変更(上位8ビットをカット)して」という解釈は間違い. unsigned int や unsigned char のビット数は規定されていないので, 「上位 8ビット」ということはできません. 処理系によっては「何も変化しない」ことすら考えられます. さらにそこを無視しても, 厳密には (2) はまだ間違い. uchar型を unsigned char型だとすると, その値を使って計算する前に int型 (または unsigned int型) に自動的に変換されます.

ron_nast
質問者

お礼

ご回答ありがとうございました。 参考にさせて頂きます。

関連するQ&A

専門家に質問してみよう