• ベストアンサー

変数のビット列

char型の変数numに num = 128 + 64 + 16; と入力した時、numの中身は、 11010000 となっているのか、 00001101 となっているのか(最下位桁が右か左か)調べたいのですが、格納されている状態(バイトオーダーが使用される前の状態)で表示する命令を教えていただけませんでしょうか。 最終的に、char型の下位7bitを使って数値処理をしたく、その場合には、 num = num << 1; と、 num = num >> 1; のどちらにすればいいのか、変わってくるかと思います。 ご回答の程お願いします。

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

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.2

型によらず整数の内部ビット表現は上位ビット←→下位ビットの順に並べることになっています。したがって <<:左シフト演算子は桁上げ >>:右シフト演算子は桁下げ です。 JIS X3010:2003にも規格書6.5.7章 ビット単位のシフト演算子の項に、 E1<<E2の...結果の値はE1×2^E2の、結果の型で表現可能な最大値より1大きい値を法とする剰余とする。...E1>>E2の...結果の値はE1/2^E2の商の整数部分とする。... となっています。

damedamekun
質問者

お礼

ありがとうございます。 おかげで、答えにたどりつけました。

その他の回答 (4)

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.5

#2です。 #4の方の回答のとおり、signed charでかつ負数の場合の処理に問題があります。 charに128以上の値を入れていたので、すっかりunsigned charだと思い込んでいました。

damedamekun
質問者

お礼

わざわざ補足説明をしてくださり、ありがとうございます。 又、誤解を招くような表記をしてしまいもうしわけありませんでした。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

やはりターゲットに依存します。 char型のビット数、符号の有無、負の値の表現方法が処理系に依存します。 特にchar型が8ビットで符号ありの場合が厄介です。この場合、numは128+64+16の値を表現できませんから、JIS X3010:2003の6.3.1.3に基づき、処理系定義の値になるか、処理系定義のシグナルを発生することになります。 仮に11010000というビット列として格納されたとしても、numを整数拡張するとint型かつ負になり、次の問題が起こります。 #2の方が規格から引用された部分は、符号なし整数に関する部分です。その直後にこう書かれています。 --- 引用ここから --- E1が符号付き整数型と非負の値をもち、E1×2^E2が結果の型で表現可能である場合、それが結果の値となる。それ以外の場合、その動作は未定義とする。 --- 引用ここまで --- つまり、numに格納された値が負ならば、それを整数拡張した<<演算子のオペランドもまた負であり、その動作は未定義になってしまいます。 したがって、これはバイトオーダーやシフト方向の問題だけではすみません。期待した処理をするには次のようにします。 unsigned char num = 128 + 64 + 16; num = num << 1;

damedamekun
質問者

お礼

回答をくださり、ありがとうございます。 num = 128+64+16; としたのは、ビット列の例を示すために書いたものですが。動作について詳しく知ることが出来たので、感謝しております。

  • ddnp009
  • ベストアンサー率25% (15/58)
回答No.3

charであれば、バイトオーダーもへったくれも ない・・・のじゃないかな。 下位7ビットを使って、というのは、 0x7Fとの論理積を取るんじゃだめ?

damedamekun
質問者

お礼

回答をくださりありがとうございます。 申し上げた、 num = num << 1; とするやり方は、あくまで手段の一つですので、 0x7Fの論理積を取る方法については、今後検討させていただきます。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.1

どういう開発かわかりませんが、ターゲットCPUが無いと正確な答えは得られないと思いますよ。 インテルの8080以降であれば、レジスタ上も11010000でしょう。8bit対象でunsigned charなら、リトル/ビッグエンディアンを気にする必要はないと思います。 2bitや4bitのマイコン用のクロス開発なら、CPUのテクニカルシートやクロス環境の説明に書いてあるんじゃないかな。 char型変数でnumというのは、可読性からすると、私のようなオールドプログラマには居心地が悪いなあ・・

damedamekun
質問者

お礼

回答をくださり、ありがとうございます。 簡単なお礼文となってしまい、もうしわけありません。

関連するQ&A

  • char型でビット列表示

    char型の変数にビット配列を代入しそれを文字として出力させたいのです。 どこが間違っているのか分かりませんが一応流れを書いたプログラムを載せておきます。 char binary = 0; int i; for(i=0;i<8;i++){ if(省略) binary = binary & 11111110; else binary = binary | 00000001; binary = binary << 1; } printf("実行結果 %c",binary); 実行結果 00110110 というように最下位ビットに0か1を代入し、左シフトをし、というのを繰り返しprintf("%c",binary)でビット列を表示させたいのですが、これを実行すると結果は文字化けしたようなものが表示されます。 charの配列を作ってビット列を表示させるやり方はわかるのですが、学校の課題みたいなもので配列を使ってはいけないみたいなのです。 教科書を読んでも分からないので困っています。 よろしくお願いします。

  • int型変数をchar型変数に格納する方法

    int型数値をchar型変数に格納したいのですが、 sprintf()とatoi()を用いてやりましたが、 うまくいきません。 考えたコードを下記します。 int get_y(){ int y=2005; return y; } int main(){ char year; char str[5]; //intをcharに変換して格納している sprintf(str,"%d",get_y()); //数値として代入 year=atoi(str); //yearには2005が格納されていない! cout<<year<<endl; char ans; //このchar型変数に数値を代入する。 ans=year; cout<<ans<<endl; return 0; } お手数をお掛けしますが、 よろしくお願い致します。

  • ■ 文字コードの出力について ■

    符号付char型の変数「moji」に文字を代入し、その文字コードの上位4ビットと下位4ビットをそれぞれAND演算でビットを抽出し、算術右4シフトと算術左4シフトで処理して元の上位4ビットと下位4ビットを入れ替えて文字コードを出力するC言語プログラムです。 例えば、「A」の文字コード「41」を「14」で出力します。 問題は「N」です。 「N」の文字コードは「4E」です。これを「E4」に変えて出力したいのですが、「ffffffe4」となってしまいます。 解決策は、符号無しchar型の変数にすることが分かりました。 なぜ、符号無しchar型の変数にしないと正常に表示できないのでしょうか? コンパイラは「Borland C++ Compiler 5.5」です。 お答えできる方、よろしくお願いいたします。

  • char*の実体の数値をchar変数に格納する方法

    ある関数の戻り値がchar*でその関数の戻り値をchar変数に格納したいです。 char *ret_ch() { char *p="12"; return p; } int main(){ char res; //ここでret_ch()の戻り値の実体数値を代入 res=*ret_ch(); cout<<"RET=="<<ret<<endl; return 0; } char型は1バイトなので一文字しか入りません。 char型に数値として扱い、上記のポインターの 実体数値を格納するにはどのようにしたらいいのでしょうか? よろしくお願い致します。

  • シェルの文字列取得について

    シェル(Bash)の文字列取得についてご教授ください。 文字列:  test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。

  • 2進数ビット列の算術シフトについて

    技術者向けでは基本的すぎて笑われてしまうかも知れません。が、プロの方で詳しい方にお聞きしたかったのです。例えば、プラスの数値を算術右シフトすれば 「あふれたビットを破棄するのは、その範囲で表現できないから切り捨てる。 たとえば3を2で割ると1.5ですが、 1右シフトすると1になりますが、 0.5を保持する桁がないからですね。 逆に桁あふれも同じ意味ですね。」という回答を見たのですが、確かにプラス部(負数でない部分)については理解出来るのですが、これがマイナスの整数(電算機上では負数)の場合、例えば「-1.5」であれば「-2」になるということでした。なぜ単純に「-0.5」部分の切り捨てで済まないのでしょうか?

  • 変数に格納できる桁数に制限はあるの?

    スカラー変数に格納できる桁数に制限はあるのでしょうか? 制限があるとすれば、どうすれば解除できるのでしょうか? 具体的には下記のような手順です。 小数15位まである数値(整数部は3桁)を変数($hoge)に代入する。 $hoge = 123.123456789012345; 次に、この変数を他の変数($fuga)に代入する。 $fuga = $hoge; さらにこの変数をSmarthに渡してブラウザに表示させると、小数点以下が12桁までしか表示されません。 どうすれば15桁をそのまま表示させることができるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語で確保できるビットの桁数

    C言語でビット単位でデータ操作する際に、確保できるビットの桁数はたとえば以下のような例の場合 unsigned char bit; 1バイト(=8ビット)なので8桁ということは勉強しました。 ここで、たとえば計算でビットの桁数を100桁用意したい場合 以下のように32*4桁という風に分ける方法しかないのでしょうか? unsigned int bit[4]; できれば一つの変数で済ませたいのですが、何か良い方法をご存知の方いらっしゃいましたらよろしくお願いします。

  • 変数(AとB)の中身をつなげて変数(C)の中身を出力したい

    いつもお世話になっております。  今回プログラム知識(書式)についての質問を記載させて頂きます。  ソース(間違っています)を用いて説明しますと <% Function Title(TitleNum,Title1,Width1,Title2,Width2,Title3,Width3,Title4,Width4,Title5,Width5,Title6,Width6,Title7,Width7,Title7,Width7,Title8,Width8)   Dim Num    Num = 0    Do Until TitleNum >= Num %>     <th width="<%=Width"Num"%>" style="border-bottom:1px solid #696969"><%=Title"Num"%></th>    (↑問題のソース箇所です。Title・Width1~8まで表現したいです) <%     Num = Num + 1    Loop End Function %>  Title・Width(1~8)の変数の中身を  変数Numの格納値を用いて、それぞれの中身を出力したいのですが  どの様なソースコードになるのでしょうか  初歩的な質問とは思いますが、ご教授お願いいたします。  以上、よろしくお願いいたします。

  • 擬似言語のある処理について

    擬似言語についてわからないことがあります。 このプログラムはスタックを使って、実数値を10進数字に変換するプログラムです。 今回質問するのは、このプログラムの中でも数値を一桁ずつ10進数字に変換して、スタックに詰め込む部分です。 Fintは整数部分。Idxは変数。 IntはFの小数部をカットする。(つまり、整数部分だけにする処理です。) Chr[]={0,1,2,3,4,5,6,7,8,9},T (Chrは数値に対応する文字列を格納したものです。) Fint←Int(F) 繰り返し処理 Fint>0ならば ・Idx ← Fint - (Fint ÷ 10) × 10;Fintの最下位桁をIdxに取り出す。 ・Push(Chr[Idx]);最下位桁Idxに対応する数字をスタックにプッシュする ・Fint←Fint÷10;次の桁を最下位の桁にシフトする。 繰り返しで上へ 上記の「Fintの最下位桁をIdxに取り出す」という処理は たとえば、12,345という数字があったならば、12の最下位桁2を取り出すということなのだと思いますが、式に当てはめて計算すると 12-(12÷10)×10となりIdxに0という数字が格納されます。 その後に、Chrで0という数値を拾ってきて文字列0が格納されることになります。 しかし、問題文を見ると12,345という数字を変換すると12,345という文字列になっておりなぜ0?になってしまうのという話になります。 私の解釈は間違いだらけだと思いますが訂正していただけると 大変うれしいです。