ページ 11

漢の文字コードについて

Posted: 2009年6月24日(水) 19:24
by マルチネス
こんばんは、いつもお世話になっています。
私はC言語は初心者でテキストを見ながら進めています。Windowsのvistaを使っていて、コンパイラはBorland C++です。

今回質問をさせていただくのは、漢の文字コードについてです。
#include <stdio.h>

void main()
{
    char str[3] = "漢";

    printf("str[0] : %x\n", str[0]);
    printf("str[1] = %x\n", str[1]);
}
私のパソコンでの実行結果は
str[0] : ffffff8a
str[1] : ffffffbf
となりました。
・1バイトは8ビットですよね。そしたら、16進数での範囲は~ffまでだと思うのですが、ここではffffff8aと表示されffの範囲を超えているのですが、どうしてでしょうか?

Re:漢の文字コードについて

Posted: 2009年6月24日(水) 20:02
by ねこ
指定値は「( unsigned char )str[0]」じゃないでしょうか
str[0]には負の値が入っているため16進表記だとビットが逆転します。

Re:漢の文字コードについて

Posted: 2009年6月24日(水) 20:54
by マルチネス
ねこ様、解答ありがとうございます。
指摘の通り、unsined char str[3] = "漢";としたら、
str[0] : 8a
str[1] : bf
と実行されました。

>str[0]には負の値が入っているため16進表記だとビットが逆転します。
ここのところが、ちょっと分からないです。

Re:漢の文字コードについて

Posted: 2009年6月24日(水) 21:19
by non
2の補数について調べてみてください。

Re:漢の文字コードについて

Posted: 2009年6月24日(水) 21:57
by YuO
>>str[0]には負の値が入っているため16進表記だとビットが逆転します。
> ここのところが、ちょっと分からないです。

反転するのではなくて,整数拡張がおきています。

BCCにおいてcharはデフォルトでは符号付きです。
なので,
char (符号付き) : -118 (8A)
が,printfの可変個引数に渡されることでint型に拡張され,
int : -118 (FFFFFF8A)
となり,それが%xに対応する箇所にあるため,unsigned int型とみなされて,
unsigned int : 4294967178 (FFFFFF8A)
として出力されています。

char => intはコンパイラが知っているところで起きているので,「値」が保存されています。
それに対して,int => unsigned intはコンパイラの知らないところで起きているので,「ビットパターン」が保存されています。
# 本当は後者は未定義動作。ビットパターンが同じ物を出力することが標準によって要求されているわけではない。

Re:漢の文字コードについて

Posted: 2009年6月25日(木) 14:43
by ねこ
失礼しました。よく見ると反転していないし見当違いでした、申し訳ないです。

<反転するのではなくて,整数拡張がおきています。
参考になりました、ご指摘ありがとうございます。

Re:漢の文字コードについて

Posted: 2009年6月30日(火) 09:39
by マルチネス
皆様、解答ありがとうございました。