漢の文字コードについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マルチネス

漢の文字コードについて

#1

投稿記事 by マルチネス » 16年前

こんばんは、いつもお世話になっています。
私は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:漢の文字コードについて

#2

投稿記事 by ねこ » 16年前

指定値は「( unsigned char )str[0]」じゃないでしょうか
str[0]には負の値が入っているため16進表記だとビットが逆転します。

マルチネス

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

#3

投稿記事 by マルチネス » 16年前

ねこ様、解答ありがとうございます。
指摘の通り、unsined char str[3] = "漢";としたら、
str[0] : 8a
str[1] : bf
と実行されました。

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

non

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

#4

投稿記事 by non » 16年前

2の補数について調べてみてください。

YuO

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

#5

投稿記事 by YuO » 16年前

>>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:漢の文字コードについて

#6

投稿記事 by ねこ » 16年前

失礼しました。よく見ると反転していないし見当違いでした、申し訳ないです。

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

マルチネス

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

#7

投稿記事 by マルチネス » 16年前

皆様、解答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る