• ベストアンサー

C言語のビットシフトの質問

C言語の右ビットシフトで、以下のプログラムの結果について、納得できずにいます。 dを右にシフトすると、上位ビットには0が入るのではないでしょうか? よろしくお願いします。 プログラム unsigned char d='0'; printf("%c\n", d); printf("%c\n", d>>5); 結果 0 『

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.2

期待する結果は何だったんでしょうか? おそらく上位ビット0入ってると思いますよ。 unsigned char d = '0'; // 文字コードがASCIIであるなら 0x30 と同義 printf("%x\n", d); printf("%x\n", d >> 5); 0x30 >> 5 → 0x01 文字コード 0x01 の文字を表示させようとして見た目おかしくなってるだけかと。

aodesu55
質問者

お礼

ありがとうございました。 理解できていませんでした。

その他の回答 (1)

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

printfで、書式に"%c"を使ったとき、何が出力されるか、理解してますか? '0'と0の違いって理解できてますか?

aodesu55
質問者

お礼

ありがとうございました。 '0'と0の違いを、理解できていませんでした。

関連するQ&A

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • C言語のscanf文について

    C++言語の勉強中で、ビット演算子のところで質問です。 動作は、キーボードから16進データを入力して、そのデータの3,4ビット目を0にした時のデータを算出するというものです。 ここでProgram中の scanf 文にてエラーが出てしまいます。 ①%X(16進数)の型がintに対して、ope変数がcharとなっている。  ⇒ここの整合を取るためにはどういう方法がありますでしょうか? 以下がProgramです。 /*************************************************************/ /* プログラム:ビット演算子 */ /* 動作内容 :ビット演算子によりビット操作する */ /* 入力データの3,4ビット目を0にした値を算出する */ /**************************************************************/ #include<stdio.h> int main(void) { unsigned char ope; unsigned char ans; printf(" Hex-Data : "); scanf("%X", &ope); printf(" ope : 0x%02X\n", ope); ans = ope & 0xe7; /* 3,4ビット目:0 */ printf(" ope & 0xe7 = 0x%02x\n", ans); getchar(); getchar(); return(0); }

  • C言語とC++の相違点?

    printf("sizeof(int)= %u\n", (unsigned)sizeof(int)); printf("sizeof(unsigned)= %u\n", (unsigned)sizeof(unsigned)); の結果がVisual C++では共に4なのですが、C言語の扱っている本では 共に2になっています。 これが単なるミスプリなのか、C++とC言語の違いなのか教えていただけますか? 回答よろしくお願いします。

  • C言語の条件式での~(チルド)について

    C言語に関しての質問です。 以下のようなプログラムでは変数bをキャストした場合と しない場合で条件式の判定結果が違います。 変数bはもともとunsiged char型なのでキャストは不要だと 思ったのですが、なぜ結果が違うのでしょうか? (条件式if(a != ~b)の判定結果も偽になることを期待していました。) unsigned char a; unsigned char b; a = ~0x98; b = 0x98; if(a != ~b) { printf("こっちは入る"); } if(a != (unsigned char)(~b)) { printf("こっちは入らない"); }

  • c言語 型変換について

    c言語 型変換について 下記のように文字コードは、unsigned int型('B')をunsigned char 型(str[1] ) 格下げする型変換する規則を教えてください。 *質問ソースプログラム: int main(void) { char str[4]; /* 文字列を格納する配列 */ str[0] = 'A'; /* 代入 */ str[1] = 'B'; /* 代入 */ ・・・・・・ printf("size B %u\n",(unsigned)sizeof('B')); printf("size str[1] %u\n",(unsigned)sizeof(str[1])); * 実行結果 size B 4 size str[1] 1

  • ビットをローテートするプログラムの解説をお願いします。(C言語)

    下記のプログラムは、rotate() を呼び出されるたびに1つずつ左にビットをローテートするものです。 #include <stdio.h> void rotate(unsigned char *c); int main(void) { unsigned char ch; int i; ch = 1; for(i=0; i<16; i++) { rotate(&ch); printf("%u\n", ch); } return 0; } void rotate(unsigned char *c) { union { unsigned char ch[2]; unsigned u; } rot; rot.u = 0; /* 16ビットをクリア */ rot.ch[0] = *c; /* 整数を左にシフト */ rot.u = rot.u << 1; /* ビットがc[1]にシフトしたかどうか確認する。 シフトしていれば、OR演算を実行して他方の端に戻る */ if(rot.ch[1]) rot.ch[0] = rot.ch[0] | 1; *c = rot.ch[0]; } 【質問】 自分で考えてみたので、間違いがあれば、ご指摘お願いします。 --------------------------------------------------------- ch = 1; だから rotate(&ch); で初回実行時に *c に1を渡す。 i=0 のとき、 rot.ch[0]  rot.ch[1] 0000 0000  0000 0000    rot.u = 0;     rot.u 0000 0001  0000 0000    rot.ch[0] = *c; *c は 1 0000 0010  0000 0000    rot.u = rot.u << 1; if(rot.ch[1]) → 偽 *c = rot.ch[0]; で *c が 0000 0010 すなわち 2 になる。 printf文で「2」を表示。 --------------------------------------------------------- i=1 のとき、 rot.ch[0]  rot.ch[1] 0000 0000  0000 0000    rot.u = 0;     rot.u 0000 0010  0000 0000    rot.ch[0] = *c; *c は 2 0000 0100  0000 0000    rot.u = rot.u << 1; if(rot.ch[1]) → 偽 *c = rot.ch[0]; で *c が 0000 0100 すなわち 4 になる。 printf文で「4」を表示。 --------------------------------------------------------- i=2 のとき、rot.ch[0] が 0000 1000 で *c が 8 になる。 printf文で「8」を表示。 i=3 のとき、rot.ch[0] が 0001 0000 で *c が 16 になる。 printf文で「16」を表示。 i=4 のとき、rot.ch[0] が 0010 0000 で *c が 32 になる。 printf文で「32」を表示。 i=5 のとき、rot.ch[0] が 0100 0000 で *c が 64 になる。 printf文で「64」を表示。 i=6 のとき、rot.ch[0] が 1000 0000 で *c が 128 になる。 printf文で「128」を表示。 --------------------------------------------------------- i=7 のとき、 【ここからがどうしても分かりません。どうか力をかして頂けないでしょうか?お願いします。】

  • C言語のビットフィールドについて

    はじめまして,今C言語を勉強中なのですが, ビットフィールドの宣言について質問があります。 勉強に使用しているテキストでは, ビットフィールドの宣言にはunsigned int型を使用すると書かれています(下記例参照)。 ここで質問は,unsigned charなどの型は推奨されない理由があるのか,ということです。 実際にunsigned char型で実行してもプログラムは動きますし,そちらのほうが語長も短くて済むのでいいような気がします。 テキストの書き方だと,他の型について言及していなかったので,なにか理由かあるのか,それとも特に問題ないのか,疑問に思っています。 わかる方いましたら,回答いただけると嬉しいです。 (ex) struct{ unsigned int bit0:1; unsigned int bit1:1; : unsigned int bit7:1; }bits;

  • unsigned int型について

    C言語初心者です。 unsigned int型に関する質問です。 --------------------------------- #include <stdio.h> int main(void) { unsigned int in1 = 10; unsigned int in2 = -10; unsigned char ch1 = 10; unsigned char ch2 = -10; printf("in1 = %d\n", i); printf("in2 = %d\n", i); printf("ch1 = %d\n", ch1); printf("ch2 = %d\n", ch2); return 0; } --------------------------------- 上記のプログラムを作成して実行すると、結果は以下の通りです。 [実行結果] in1 = 10; in2 = -10; ch1 = 10; ch2 = 246; 変数in2の値を表示した結果に関してですが、 unsigned int型にも関わらず負の値「-10」が表示されるのは 何故でしょうか?

  • C言語で確実に論理右シフトをする方法。

    算術右シフトと論理右シフトをC言語にて実装しようとしています。 『ハッカーのたのしみ』にある論理右シフトを用いて算術右シフトを作る方法を使おうと思っているのですが、C言語で確実に論理右シフトするにはどうすればよいのでしょうか。 int x; (unsigned int) x >>= n; とするとgccではゼロ拡張してくれるようなのですが、 use of cast expressions as lvalues is deprecated というWarningが出ます。 この方法が確実とは思えませんし、 unsigned int xx; xx = x; も処理系依存と聞きます。 出来ればWarningが出ない形で解決したいのですが、どうすればよいのでしょうか。 教えてください。

  • C言語で確保できるビットの桁数

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

専門家に質問してみよう