プログラミングにおけるビットの理解とは?

このQ&Aのポイント
  • プログラミングを独学で学んでいる中で、ビットについての理解がまだ完全ではありません。
  • ビットはメモリや容量の単位として知られていますが、詳細な理解が欠けています。
  • 変数の復習中に、ビットの説明に疑問が生じました。例えばintは32ビット符号付き整数という説明ですが、この場合の解釈について理解したいと思っています。
回答を見る
  • ベストアンサー

プログラミングにビットについて

独学でプログラミングを勉強しているものですが、ビットについてまだ完全に理解できていません。 ビットというのは、メモリだとか、容量だとかという大雑把なことは分かっているのですが 詳しく完全に理解できてるわけではありません。 そこで 今日変数の復習をしていた所 教本の説明の欄の ○○(数字)ビット符号付き整数 みたいなものに疑問をもちまして 例えばintなら32ビット符号付き整数というような説明の形なのですが この場合のintの説明の解釈というのは 二進数で0一つで1ビットを占めているとして 32ビット符号付き整数というのは 二進数で言う+(-)0x31の数値を表現することができ、 なので この場合、+(-)を1ビット占めているので表現できる数字は10進数で言う+(-)2^31-1が限界ということでいいのでしょうか?

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

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

本題からは外れますが, 処理系 (コンパイラなど) を決めずに「intなら32ビット符号付き整数」と書いてあるような「教本」は眉に唾をつけながら読んだ方がいいかもしれません. 「この処理系なら int は 32ビット」ということはできますが, 「C言語一般」に成り立つことではありません. かつては「int = 16ビット」という処理系もよくありました. ついでにいうと C の規格では「1バイト」のビット数も決められていない (ただし「8ビット以上」ではある) という罠もあったりします. で本題ですが.... 符号付きでは「2の補数」で確定でしたっけ>#1. C11 のドラフトを見てみましたが, N1570 までは「3通りのいずれか」としか書いてません. とりあえず C99 レベルでは「int が 32ビットなら ±(2^31-1) までしか保証されない」というくらいかな.

その他の回答 (2)

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

1バイト = 8ビット になります 8ビットで数値を表すと、0-255 符号付整数は最上位ビット=0 のとき正数 =1 負数と考えます 8ビットで符号付整数は、-128~127を表し、16進数で表せば $00=0 ~ $7F=127 $80=-128 ~ $FF=-1 になります (加算命令で減算と同じ結果になります、$01 + $FF -> $00 )

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

ビットは、二進数の桁だと思ってください。 例えば、「10進数で3桁」と言えば、 一桁で0~9の10通り それが3桁なので、組み合わせは「重複ありの順列」になって10^3通り。 符号無しなら最小000~最大999です。 同様に「2進数で32桁=32ビット」と言えば、 一桁で0~1の2通り それが32桁なので、組み合わせは「重複ありの順列」になって2^32通り。 符号無しなら最小000...0(0が32個)~最大111...1(1が32個)です。 2進数だと数がわかりづらいので、よく4桁ずつに区切って、16進数として表現します(2^4=16ですから) 32bit→8*4bit→8桁16進数 です。これは、日常でも3桁にカンマをうったり、4桁毎に位が付いたり(万、億、兆....)するのと似ています。 > 二進数で0一つで1ビットを占めているとして 「0か1かを取ることができる」です。0だけではありません。 > 二進数で言う+(-)0x31の数値を表現することができ、 0x31 = 3 * 16 + 1 = 49 です。 32でもないし、32bitでもありません。 符号付きは少々ややこしくなります。 まず、全ての組合せのうち、半分を負の表現に使うことにします。 下半分の0x00000000~0x7fffffff をそのまま正の値に使えば楽ですし、0x80000000以上は最上位ビットが1なので「正負」の判定が楽です。 あとは、0x80000000~0xffffffffをどう負の値に割り振るか、です。 Cの整数では、「2の補数表現」を使っています。 補数について詳しくは調べてもらうとして、補数の性質を使うと、bがaの補数として a+b=0x1 00000000(33bit)→0 (最上位は収まる場所が無いので無視される) となるので、 a+b=0 → b=-a と負の数値のように見えるわけです。 この場合の範囲は -2^32~2^31-1 になります。

igo404
質問者

補足

回答ありがとうございます。表現ミスがありました。 > 二進数で言う+(-)0x31の数値を表現することができ というのは、 2進数の「+(または-)0000000000000000000000000000000」であらわせる10進数を表現することができ ということです。

関連するQ&A

  • 8ビットを2進数で表現すると…

    質問です。 符号付の整数を8ビットの2進数で表現するとき、00110111-11000001の演算結果はどのようになるのでしょうか? 符号ビットは左端にあり、負数は2の補数で表します。

  • VC++ windows 64ビットプログラミング

    VC++でのwindows 64ビットプログラミングを勉強しています。 以下のMSDNのページにたどり着き、サンプルプログラムを作りながら確かめているのですが、 http://msdn.microsoft.com/ja-jp/library/3b2e7499.aspx 以下の記述の意味がよく分からないので、教えてください。 ---ここから--- int と long は、64 ビット Windows オペレーティング システムでは 32 ビット値です。 64 ビット プラットフォーム用にコンパイルする必要があるプログラムでは、ポインターを 32 ビット変数に割り当てないように注意してください。 ポインターは、64 ビットのプラットフォームでは 64 ビットなので、ポインターを 32 ビット変数に割り当てると、ポインター値を切り捨てることになります。 ---ここまで--- intとlongのサイズが4バイトでこれは32ビットのときと変わらず、 ポインタのサイズが8バイトに拡張された(これはメモリアドレスが64ビットになったのだから当然)のは理解しているのですが、 http://msdn.microsoft.com/ja-jp/library/94z15h2c.aspx 「ポインターを 32 ビット変数に割り当てる」というのがどういうこと(どういうコード)なのかがわかりません。 こんなことかなとも思ったのですが、これはありえない記述ですよね =============== int a = 0; int *pt = NULL; a = pt; //32ビット変数にポインタを割り当て???(というよりポインタを代入か) error C2440: '=' : 'int *' から 'int' に変換できません。 1> この変換が可能なコンテキストはありません。 =============== 32ビットでは問題にならなくて、64ビットになったから問題になって、どう変えれば問題なくなるのか という感じで説明していただけると分かりやすいのかな思います。 よろしくお願いします。

  • プログラミングの問題です。

    プログラミングの問題です。 二つの自然数の最大公約数(つまり二つの整数を割りる最大の数)を 求める「ユークリッドの互除法」のアルゴリズムを 箇条書きで表現せよ。ただし、PADおよびプログラミングに書き直せるように 適当な変数を用いること。と言われました。 私はどうしていいかわかりません。どなたか解答してくれませんか。 よろしくお願いします。アドバイスとか何でもいいのでよろしくお願いします。

  • 符号付の整数8ビット…

    教えてください。 符号付整数8ビットの2の補数で表現するときの11101111-11110011の計算を2進数で示すときの途中の計算方法を教えてください。 10進数のー13を8ビットの固定小数点(負数は2mの補数形式)の途中の計算方法も教えてください。

  • プログラミングがわかりません

    1.多倍長数で表現した整数aとint型で表現した整数xを乗算し、その結果をaに格納するプログラムを作れ。 #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 0, 0, 1, 0, 2, 4, 6, 5, 5, 3, 6}; int x = 512; /*必要な変数があれば適宣宣言しなさい*/ /*多倍長数(c) <-- 多倍長数(a) * int型(x)*/ (ア) 出力省略 return 0; } 実行結果 a = 52462354432 2.多倍長数を用いて1から80までの各整数の階乗を計算し、正しい値を表示するプログラムを作れ。 注意 80の階乗を表現するためには、少なくとも119桁の整数を格納できる多倍長数を用いなければならない。 実行結果 1! = 1 2! = 2 3! = 6 ・・・ 3.多倍長数で表現した整数aとint型で表現した整数xで除算し、その結果をaに格納するプログラムを作れ。 aがxで割り切れない場合に生じるあまりは使用せずに捨ててもよい。 除算の途中で現れる整数はint型で表現できる範囲であることを仮定してもよい。 ソースコード #include<stdio.h> #define KETA 12 int main(void){ int a[KETA] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1}; int x = 365; /*必要な変数があれば適宣宣言しなさい*/ /*多倍長数(a) <-- 多倍長数(a) ÷ int型(x)*/ (ア) return 0; } 実行結果 a = 33823777 2はまったくわかりません 1,3の出力はわかるのですが、計算過程がわかりません 教えてくださいよろしくお願いします。

  • 8進法の計算

    独学でプログラミングの勉強をスタートしましたが、ビット数の概念を理解するにあたり、進法(例:2進法、16進法など)が使われており、早くもそこで躓いてしまいました。 テキストの質問: 6ケタの8進法を使用するコンピューターの場合、 1)何ビットとなるか? 2)8進法で、このコンピューターに内臓できる最大の整数は? 3)10進法と関連する数字はあるか? 4)最大の負の整数は、8進法と10進法では何になるか? 8進法について分かりやすく説明して頂けますでしょうか? 宜しくお願い致します。

  • プログラミングの課題です。

    プログラミングの課題です。 9個のマスがあり、1~9の数字が一個だけ入るとする。 このとき、符号なし整数1つでマスにまだ入れられていない数字を記録したい。 そこで、下位ビットから9ビット目までで1~9がマスに入っているかどうかを表すこととする。 空白のマスは0で表示する。 例:132584090→下位9ビット:001100000 この場合、6もしくは7がマスに入っていないため、6ビット目と7ビット目に1が立っていることとなる。 課題プログラムを実行すると、in.txtから9個の文字データを読み込み、上記のような変換をして9ビットのデータのビット列を表示する。例えば132584090とin.txtに記録されていた場合、下位9ビットは001100000と表示される。 手順 1..ビット列を記録する変数を宣言し、0で初期化する。 2..9個の数字を9個の変数に ファイルから読み込む 3..各変数には0~9の数字が入っているが、0以外の場合に対応する桁に1を立てる 4..ビット列の 0と1を反転させる 5..下位9ビットをprintf関数で表示する 6..in.txtの値をいろいろ変化させて、プログラムが正しいことを確認せよ。 #include <stdio.h> int main() { int i,a[10],b; FILE *fp; fp=fopen("in.txt","r"); if(fp==NULL){ printf("ファイルが開けませんでした\n"); } while(fscanf(fp,"%d %d %d %d %d %d %d %d %d",a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i],a[i]))i++; for(i=0;i<9;i++){ a[i]='\0'; } for(i=0;i<9;i++){ a[i]=b; } b=~b; printf("下位9ビット",(b%256)&8,(b%128)&7,(b%64)&6,(b%32)&5,(b%16)&4,(b%8)&3,(b%4)&2,(b%2)&1,b%1); return(0); } こんな感じで作りましたが、実行できませんでした。できれば詳しく解説していただけるとたすかります。よろしくお願いします。

  • ソースについて聞きたいのですが・・・

    符号付32ビットの整数値を入力して、32ビットの2進数の表示と16進数の表示をしたいのですが、ソースのヒントを教えてくれればうれしいです。わかるところまで書きます。 int x; printf("符号付32ビットの整数値の入力:"); scanf("%d" ,&x); その後を教えて下さい。

  • 9ビットの2進数を符号付整数…

    問題の意味がわからないのですが、どう解けばいいですか? 9ビットの2進数を符号付の整数とみなしたときの数値の範囲を、10進数で下限~上限の形で示せ。符号は2の補数。

  • ビット数と表現できる数の範囲の関係

    基本情報技術者の勉強を独学でしています。 nビットを用いると、符号なし整数なら0~2^n-1の範囲、符号付整数なら2^(n-1)~2^(n-1)-1の範囲の値を表す事ができると参考書にありました。 ここで気になったのですが、もしn=2の場合、符号付き整数は-2~1の範囲にある4(2^2)個が表現できる事になりますよね? 00が0、01が1、11が-1までは納得がいくのですが 10を-2として扱って良いのかわからなくなってしまいました。 これはどのように考えれば良いのでしょうか?