short型の値を返すことができるのでしょうか?sは1バイト、というのは勘違いでありましょう。charではありません。バグのないプログラムはない。プログラムは思ったとおりには動かない。charポインタですので、s[0]なら確かに1バイトですがsは1バイトの変数ではありませんね。<<と言う演算子の意味はご存知でしょうか?上のポインタであると言うことと<<演算子が重要ポイントなのですが。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。char型であるということを書きたかったのですが、あきらかに言葉不足でした。もうしわけありません。aをxビット分だけ左にずらす演算子だと思っています。11011000を返すポインタであることをどのように利用されているのかは、分かりません。aをxビット分だけ左にずらす演算子だと思っています。11011000を返すいえ、1バイトの変数に対して<<3演算してもこうはなりません。実際にprintfして確認してみて下さい。ポインタであることをどのように利用されているのかは、分かりません。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。何となく、質問者さんが行ないたいことは↓こういうことではないかなぁ、などと勝手に想像しています。いえ、1バイトの変数に対して<<3演算してもこうはなりません。実際にprintfして確認してみて下さい。これは筋が違うのではないかなぁ、などと勝手に想像したりしています。想像がはずれているだけかもしれないですけれど。バグのないプログラムはない。プログラムは思ったとおりには動かない。8|7|6|5|4|3|2|9のように、s[0],s[1]ともに1バイトずつ取り出すこういうことでしょうか?>>いえ、1バイトの変数に対して<<3演算してもこうはなりません。実際にprintfして確認してみて下さい。11011000を返すとなってしまっています。以下に確認用に作ったプログラムのソースを載せるので、問題点を教えてください。8|7|6|5|4|3|2|9のように、s[0],s[1]ともに1バイトずつ取り出すこういうことでしょうか?たしかに1バイトづつ取り出しますが、1|2|3|4|5|6|7|8|8|7|6|5|4|3|2|9はビット?バイト?のどちらを表しているんでしょうか?|区切り1つが1バイトですか?|区切り1つが1ビットだと0か1しか格納できないはずです。バイト区切りなら、s[0]とs[1]の値を16進数で書いてみて下さい。11011000を返すとなってしまっています。以下に確認用に作ったプログラムのソースを載せるので、問題点を教えてください。上位ビットをと0x00ffで削っているのは何故でしょう。s[1];}この関数の何処の部分が該当するんでしょうか?私には0x00ffに該当する部分は無いと思いますが。shortですので1バイトでは有りません。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。charですが、演算時にはint型に昇格します。charなのに上位にあふれたビットが残ります。汎整数拡張とか整数拡張とか汎整数昇格で検索してみてください。short型に丸めて戻り値という流れになります。(右に向かってメモリ上のアドレスが大きくなっていく)は、1ビット区切りです。16個の区切りをつけるのに番号を付れば楽に区切れたので本来記録できないはずの値を載せてしまいました。0xe8これでいいのでしょうか?>>わざわざ上位ビットをと0x00ffで削っているのは何故でしょう。自分でもなぜ削ったのか分からなくなりました。3);で出力される値が違ったので無理やり合わせたのだと思います。charですが、演算時にはint型に昇格します。1で2バイトに昇格したので自動的にs[1]も2バイトのint型に昇格するISLeさんは「int型に昇格」と言っています。2バイトになるとは言っていません。int型が2バイトの機械では2バイトに昇格することになります。それから、ビットごとにアドレスを振る考え方は良くないと思います。C言語で考えられる最小の単位はバイトですから、バイト単位でアドレスを考えて下さい。int型のバイト数は実は処理系依存なのですが、それを言っていると複雑なので一般的なPCの環境(x86系Linux/WindowsでVc++やgccを利用)と想定して話を進めます。int型は4バイトです。int型に昇格(暗黙の型変換)については、char,short,intの計算時は無条件にint型に昇格します。ing型に昇格します。1で2バイトに昇格したので自動的にs[1]も2バイトのint型に昇格するなので中途半端に2バイトに昇格することはありません。場合は上位ビットは0と想定されます(これも処理系依存)。short)に格納できるようにするということでしょうか?2バイトの情報を得るという機能以外に無条件にビックエンディアンの形で値を得ることが出来ると言う点が重要です。x86系CPUはリトルエンディアン系なので、こういう事をしないとビックエンディアンの値を得ることが出来ません。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。int型に変換します。環境を書き忘れていました。VC++2008以下上記の環境を前提条件としてお願いします。0xffff;printf("%d\n",promote);promote++;printf("%d\n",promote);コードを書いて試してみたのですが、6553565536と表示されました。int型は4バイトです。4バイトですので数値の上限は2の32乗-1で4294967295です。[補足]C/C++は動的に変数の扱いが変わることはありません。変数が自動的に昇格することはありません。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。int));で確認してみましたが4バイトでした。intを表示させるなら%uでした。int型以上に昇格することはないと受け取ってもいいのでしょうか?受け取って良いと思います。調度良い記事があるので読んでみて下さい。方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。C言語辞典」を一冊持っていると役立つだろうと思います。汎整数拡張の話とか、ビット演算の話(符号あり整数にビット演算すると処理系定義になる話とか)も乗っています。7年前わたしの回答は最初の質問のコードに対してであり、汎整数拡張もビットシフト演算子に付随して言及したものです。暗黙の型変換のルールについて興味があるなら規格をあたってください。サイトのJIS検索でC/C++プログラミング言語の規格を読むことができます。JIS規格番号はCがX3010、C++がX3014です。printfは可変個数引数を取るので汎整数拡張の対象になります。暗黙の型変換については大ざっぱに言って自動的にサイズの大きい型に昇格する仕組みです。7年前>>softya(ソフト屋)さんさっそく参考記事の方読んでみます。C言語辞典」を次に書店を訪れたときに探してみます。最初の質問内容からだんだんとずれていってしまい、もうしわけありませんでした。s[1];}をどうにかこうにか迫って行けそうになってきたので、ちゃんと理解できているかを実際にコードを書いて確かめてみたいと思います。boxさん、softya(ソフト屋)さん、ISLeさん、beatleさん今回は本当にありがとうございました。自分一人では何を調べれば理解できるようになるのかすら分からず途方に暮れていました。ミクプラは自由にリンクできます。