【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18883

\0と0x00の違い
投稿者---はつ(2004/12/26 18:30:32)


皆様はじめまして。
「\0」と「0x00」の違いって何でしょうか?
例えば、memset関数で指定した領域にセットする値を「\0」と「0x00」ではどんな違いがあるんでしょうか?
ご存知の方ご教授お願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:\0と0x00の違い 18886 monkey 2004/12/26 19:11:17
<子記事> Re:\0と0x00の違い 18887 nop 2004/12/26 19:29:11
<子記事> Re:\0と0x00の違い 18888 江戸門電鉄 2004/12/26 19:53:53
<子記事> Re:\0と0x00の違い 18889 はつ 2004/12/26 20:29:05


No.18886

Re:\0と0x00の違い
投稿者---monkey(2004/12/26 19:11:17)


>「\0」と「0x00」の違いって何でしょうか?

「\0」は文字列の終端を表すもので、終端文字とかヌル文字とか呼ばれます。
'\0'で、終端文字の文字コード(文字を表す整数値)が得られます。
「0x00」は値0を16進数で表記したものです。

>例えば、memset関数で指定した領域にセットする値を「\0」と「0x00」ではどんな違いがあるんでしょうか?

ASCIIコードでは、'\0'(終端文字コード)は十進数表記で0、十六進数表記0x00ですから、結果に違いはありません。

# 終端文字コードが0x00以外の値となっている環境があるかどうかは寡聞にして知りません。


この投稿にコメントする

削除パスワード

No.18887

Re:\0と0x00の違い
投稿者---nop(2004/12/26 19:29:11)


>「\0」と「0x00」の違いって何でしょうか?

0x00 は数値定数で、16 進数で値 0 を示したものです。
「\0」は、エスケープ文字の「\ooo」('o'は8進数字)で、
数値の 0 を表記したものです。

コンピュータ内では違いはありませんが、
人間がソースコードを見た時に、
文字としての 0 を指定しているのか、
数値としての 0 を指定しているのか、
が判断出来る、位の違いでしょう。

# 「\0」で注意しなければならないのは、
# 文字列リテラルなどで「"\01"」と書くと、
# 「'\0'」「'1'」「'\0'」の 3 文字ではなく、
# 「'\1'」(='\01')「'\0'」の 2 文字を表す、
# と言う辺りでかね。


この投稿にコメントする

削除パスワード

No.18888

Re:\0と0x00の違い
投稿者---江戸門電鉄(2004/12/26 19:53:53)


サイズは違いますね。
int main()
{
    int a = sizeof '\0';
    int b = sizeof 0x00;

    return 0;
}


実行すると分かるように、aには1、bには4が入ります。
要するに前者が文字型、後者が整数型と言う事ですね。
なお、C++として確認しましたが、
Cの場合は結果が異なるかもしれません。


この投稿にコメントする

削除パスワード

No.18890

Re:\0と0x00の違い
投稿者---はつ(2004/12/26 20:41:36)


ご説明していただきありがとうございます。

>実行すると分かるように、aには1、bには4が入ります。
>要するに前者が文字型、後者が整数型と言う事ですね。

確かに文字型と整数型であればバイト数(でよかったでしょうか?)が変わってきますね。気づきませんでした。
とても勉強になりありがとうございました。



この投稿にコメントする

削除パスワード

No.18891

Re:\0と0x00の違い
投稿者---Hermit(2004/12/26 21:05:42)


>サイズは違いますね。
>
int main()
{
    int a = sizeof '\0';
    int b = sizeof 0x00;

    return 0;
}


>実行すると分かるように、aには1、bには4が入ります。
>要するに前者が文字型、後者が整数型と言う事ですね。
>なお、C++として確認しましたが、
>Cの場合は結果が異なるかもしれません。

そうですね。
Cは、C++と違って、共に sizeof(int) と同じです。



この投稿にコメントする

削除パスワード

No.18893

Re:\0と0x00の違い
投稿者---nop(2004/12/26 21:25:10)


>要するに前者が文字型、後者が整数型と言う事ですね。

文字定数は int 型です。


この投稿にコメントする

削除パスワード

No.18889

Re:\0と0x00の違い
投稿者---はつ(2004/12/26 20:29:05)


monkeyさん、nopさんありがとうございます。
結論としてmemset関数にどちらをセットしても、同じ結果になるということなんですね。
大変良く分りました。

ここで別の疑問が出てきました。
それはmemset関数をMSDNで調べたら、第2引数はint型で「設定する文字」という説明でした。
文字と言うのはchar型でなければならないのでは?と私自身思うのですが、第2引数はint型の整数値です。
これはどういうことを言っているのでしょうか?

int型という説明なので、セットする値は0x00でなければならないだろうと思います。
しかし文字ということならchar型の'\0'をセットすべきでは、と思います。

初心者の質問かもしれませんが、訳がわからず混乱中です。



この投稿にコメントする

削除パスワード

No.18892

Re:\0と0x00の違い
投稿者---Hermit(2004/12/26 21:09:41)


memset は、extern C されているはずなので、
Cと同じに扱っていいはずです。

警告くらいは出すかもしれないが。


この投稿にコメントする

削除パスワード

No.18894

Re:\0と0x00の違い
投稿者---monkey(2004/12/26 23:02:40)


char型は'文字型'とも呼ばれますが、計算機内部では、char型の値は1バイトの整数値として扱われますので、1バイト以上の整数型であればchar型の値を保持することができます。
したがって、int型の変数にchar型の値を代入することや、int型の関数の引数にchar型の値を渡すことは問題はありません。
memsetの第2引数がchar型でなくint型とされている理由は言語規格を作成した人に聞かないと分かりませんが、' 'で囲んだ文字定数がint型であることとも関係あるかも知れませんね。


この投稿にコメントする

削除パスワード

No.18900

Re:\0と0x00の違い
投稿者---Hermit(2004/12/27 13:12:14)


Cの関数に渡す引数の仕様は、
整数型は、int より小さいものはintまで拡張して、
実数型は、doubleより小さいものはdoubleまで拡張して
渡すというのが仕様だからです。

昔の、K&R の時代にはプロトタイプ宣言はありませんでしたので、



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧