プロが教える店舗&オフィスのセキュリティ対策術

C言語では、バイト単位の値を使用する組込用途などにおいて、
以下のような配列の初期化の方法を見かけることがあります。
unsigned char buff[3] = {0x00,0x01,0x02};

上記のような初期化を行なわないで使用する場合、例えば、
unsigned char buff[3];
と宣言した場合

上記の配列の宣言後、バイト毎に入力する方法
上記の配列の宣言後、文字列として入力する方法など、御教授ください。

A 回答 (3件)

unsigned char だろうと char だろうと int だろうとやることは同じです. さて, int の配列だったらどうしますか?



ちなみに #2 はいくつか誤解しているところがあるのでその指摘もしておきましょう.
・ただの char が signed であるか unsigned であるかは処理系依存です.つまり
char buff[3];
という宣言が
unsigned char buff[3];
と同じであるような処理系も存在しえます.
・C において負数の表現方法には「2の補数」, 「1の補数」, 「符号+絶対値」のいずれもがありえます. なので, signed char で表すことのできる最小値である SCHAR_MIN は規格上 (-128 ではなく) -127 以下となっています.
・念の為書いておくと, char のビット数も処理系定義です.
    • good
    • 1

このような質問をされると言うことは、「signed(符号付き)」と「unsigned(符号無し)」を理解されていないようですね。


char buff[3]
と宣言した場合、省略可能なだけで、「signed char buff[3]」になります。
2進数で表記した場合に、先頭ビットが符号になるものが符号付きで、符号にならないものが符号無しです。

0000 0000~0111 1111が正の数
1000 0000~1111 1111が負の数
つまり、先頭ビットが0なら正、1なら負になるのが符号付きで、-128~127までの数値が表現出来ます。

これに対し、符号無しでは、先頭ビットに意味を持たず全て正の数になるので
0000 0000~1111 1111で、0~255となります。

intの場合も同様です。(32ビットの場合)
signed int -2147483648 ~ 2147483647
unsigned int 0 ~ 4294967295

メモリ上では「0」「1」の2進数で保存されているので、これを人間が理解しやすい10進数などで表記する際に先頭ビットを符号として扱うか否かの違いなだけです。
    • good
    • 0

>上記の配列の宣言後、バイト毎に入力する方法



buf[0] = 0;
buf[1] = 1;
buf[2] = 2;

>上記の配列の宣言後、文字列として入力する方法

memcpy(buf,"\0\1\2",sizeof buf);
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A