PSP xvi
PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

記事の間違いを報告 新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク
公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル
TAG>
全記事にタグをつけています http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター
このブログについて
著作権などの こまかい利用規約については、こちらを開いてお読み下さい
このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ
当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。
このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all
PSPプログラミング 準備編 3 バイト・ワード・ダブルワード、符号、変数
2009/01/29
Thu. 21:01
まず、「バイト(=Byte/Bytes)」を解説します。
昔の8ビット・パソコンの頃は「メモリ64KBです」とか、
OS = Windows 98 , 「メインメモリ128MB!」とか、
OS = Windows XP , 「メインメモリ512MB!」とか、
OS = Windows VISTA , 「メインメモリ4GB!」とか、
OSやパソコンによって様々ですが、この「バイト」について突っ込みします。
「コンピュータ(CPU)は、本当は2進数しか理解できない」という事を肝に銘じて欲しい。
故に、CPUは「2のn乗」単位でのみ、情報を入力/出力しています。
「キロバイトというのは 簡単に バイトの1000倍」と思われがちですが、実際は1024倍なのです。
これは、2の10乗が1024だからです。
よって、1キロバイト(=1KB)は、1024バイトという事になります。
メガバイト(=MB)は、キロバイト(=KB)の1024倍です。
問い詰めると、メガバイトは、1024バイト×1024倍=1048576バイトです。
以下、表記すると
1 Byte
1 KBytes(キロバイト) = 1024 Bytes
1 MBytes(メガバイト) = 1024 KBytes (=1024x1024=1048576 Bytes)
1 GBytes(ギガバイト) = 1024 MBytes (=1024x1024x1024=1073741824 Bytes)
1 TBytes(テラバイト) = 1024 GBytes (=1024x1024x1024x1024)
1 PBytes(ペタバイト) = 1024 TBytes (=1024x1024x1024x1024x1024)
です。
64KB(64キロバイト)というのは、65536バイトです。
16ビット数値で表現できる 数値の個数が、65536個です。
(符号無し 16ビット数値での最大値は 65535 です、注意! / 理由は、ゼロも一つの数値として表現するからです)
範囲は 0~65535 で、個数が 65536個。
「バイト」「ワード」「ダブルワード」等の概念について
1バイトの2倍、2バイト(2 Bytes)は、1ワード(1 words)と表現される事があります。
1ワードの2倍、4バイト(4 Bytes)は、1ダブルワード(1 doubble words)と表現される事があります。
1ダブルワードの2倍、8バイト(8 Bytes)は、1ロングワード(1 long words)と表現される事があります。
「符号」とは何ですか?
符号の概念は、算数や数学のソレと同じですが、CPUが判断するのは、
・数値の一番上のビット(最上位ビット)が0なら正の値
・数値の一番上のビット(最上位ビット)が1なら負の値
と、その数値を2進数に変換して見れば一目瞭然です。
数値が正なのか負なのか 解からなかったら、数値を2進数で考えると理解できるかと存じます。
(例 / テーマはPSPなので32ビットで考えます)
3(10進) → 00000000000000000000000000000011(2進)
→ 最上位ビットが0なので、正の値
-1(10進) → 11111111111111111111111111111111(2進)
→ 最上位ビットが1なので、負の値
65534(10進) → 00000000000000001111111111111110(2進)
→ 最上位ビットが0なので、正の値
0(10進) → 00000000000000000000000000000000(2進)
→ 最上位ビットが0なので、正の値(但し、ゼロである)
? → 1001100101011100110110001011011(2進)
→ 最上位ビットが1なので、負の値
"- (マイナス)" という記号を 数値に埋め込む事は、CPU や プログラム上では行ないません。
ソースコード上で、signed で定義されていれば数値がマイナスの数値になることがあります
ソースコード上で、unsigned で定義されていれば数値はマイナスの数値になることはありません
「変数」とは何ですか?
変数とは、数値を代入して演算する為の、英数文字で表記される、値が変動する入れ物、と覚えて下さい。
数学での「Z = X+(Yx4)-12」での、Z , X , Y が それぞれ 変数です。
符号付き1バイトは、-128 ~ 0 ~ 127 の範囲の値 となります。
C言語/C++言語では、符号付き1バイト変数「i」を定義する際は、
signed char i; // i は符号付き1バイトの値を扱う変数
などと表記します。
逆に、符号無し1バイトは、0 ~ 255 の範囲の値 となります。
C言語/C++言語では、符号無し1バイト変数「i」を定義する際は、
unsigned char i; // i は符号無し1バイトの値を扱う変数
などと表記します。
行中の // 以降は注釈ですので、プログラム上では無視して下さい。
符号付き2バイト(1ワード)は、-32768 ~ 0 ~ 32767 の範囲の値 となります。
C言語/C++言語では、符号付き1ワード変数「i」を定義する際は、
signed short i; // i は符号付き2バイトの値を扱う変数
などと表記します。
符号無し1ワード変数「i」を定義する際は、
unsigned short i; // i は符号無し2バイトの値を扱う変数
などと表記します。i = 0 ~ 65535 の範囲の値。
1ダブルワード変数の定義は、
signed long i; // i は符号付き4バイトの値を扱う変数
unsigned long j; // j は符号無し4バイトの値を扱う変数
( i = -2147483648 ~ 0 ~ 2147483647 の範囲の値 )
( j = 0 ~ 4294967295 の範囲の値 )
などと表記します。
また、1ダブルワードは4バイト数値を扱うので int でも定義可能でして・・・
signed int i; // i は符号付き4バイトの値を扱う変数
unsigned int j; // j は符号無し4バイトの値を扱う変数
( i = -2147483648 ~ 0 ~ 2147483647 の範囲の値 )
( j = 0 ~ 4294967295 の範囲の値 )
などと表記します。
1ロングワード変数の定義は、
__extension__ signed long long i; // i は符号付き8バイトの値を扱う変数
__extension__ unsigned long long j; // j は符号無し8バイトの値を扱う変数
(long long キャストは、先頭に __extension__ を記述しないとダメみたいです )
などと表記します。
変数が何バイトの型であるか宣言するのに使う、char や short や long は、キャストと呼ばれます。
int というキャスト は、C++コンパイラによって2バイト扱いだったり4バイト扱いだったりするので、short か long を使ったほうが無難です。
この講座で使う C++コンパイラ=PSPSDK は、intを32ビット扱いしますので、long と同じです。覚えておいて下さい。
尚、小数点付きの数値を扱うには、float や double というキャストがありますが、省略します。各自、学習しておいて下さい。
ここまで書いておいて何ですが、'signed' の場合は、記述を省略できます。
long だったら 符号付きの 32ビットキャスト(signed long)と考えて良いのです。
私は signed は省略して記述しませんので、各自、覚えておいて下さい。
以下、覚え書き程度に。
char は signed char と同じ
short は signed short と同じ
int は signed int と同じ
long は signed long と同じ
- 関連記事
-
- PSPプログラミング 準備編 3 バイト・ワード・ダブルワード、符号、変数 (2009/01/29)
- PSPプログラミング 準備編 1 2進数に慣れよう (2009/01/28)
- PSPプログラミング 準備編 2 「ビット」と「バイト」、「16進数」について (2009/01/28)
- PSPプログラミング 準備編 4 - コンパイル・アセンブル・リンクとは? (2009/01/30)
- PSPプログラミング PSPの性能を知ろう! (2009/01/31)
[edit]
« PSPプログラミング 準備編 4 - コンパイル・アセンブル・リンクとは? | PSPプログラミング 準備編 2 「ビット」と「バイト」、「16進数」について »
この記事に対するコメント
x86系のCPUは最初期の8086が16bitCPUの為、
2Byte=ワードが基準になってますけど。
PSPにおいては32bit CPUがですので
2Byte=ハーフワード
4Byte=ワード
8Byte=ダブルワード
となります。
Re: タイトルなし
> x86系のCPUは最初期の8086が16bitCPUの為、
> 2Byte=ワードが基準になってますけど。
> PSPにおいては32bit CPUがですので
> 2Byte=ハーフワード
> 4Byte=ワード
> 8Byte=ダブルワード
> となります。
wikipedia で 「ワード」 を調べると、“現在ではCPUによってレジスタ長などのハードウェア構成とは直接関係なく2バイトを表す事が多い。” とあります。
いっぽう、CPUのビット数と同じビット数のデータ量を、ワードと表すことが多いという意見もあります。
どちらの意見も間違ってないとは思うので、R4000の解説本を買って調べるしかないようです。
インターネットの本屋さん「本やタウン」で調べて買おうっと。
記事の訂正とかは、しばらく お待ち下さい。
トラックバック
| h o m e |




