
#include<stdio.h>
int main(void)
{
char x[5] = "亜";
printf("%x %x", *x, *(x + 1));
return 0;
}
全角文字を符号化しようとして上のプログラムを考えましたが
実行結果が 「ffffff88 ffffff9f」となってしまいました。
(SJISでは亜 = 889f)
(1)「88 9f」と表示されないのはなぜですか?
(2)4バイトで表示される理由。char型は1バイトでした。
(3)また、リトルエンディアンなので「9f 88」と
表示されないのはなぜですか。
お願いします。
ソースコード編集 SJIS
OS windows Vista 32bit
CUP intel
No.2ベストアンサー
- 回答日時:
確かに
>(SJISでは亜 = 889f)
ですので、x[0]=0x88 x[1]=0x9fが格納されています。
で、それを表示させようとしているのですが、
x[]は、unsignedが指定されていないchar型つまりsignedですので、
x[0]=0x88=136ではなく-120です。同様に、x[1]=0x9f=159ではなく-97です。
%xは、typeが宣言されてないので、int型つまり32ビット符号有りとみなされて
x[0]=-120=0xffffff88 、 x[1]=-97=0xffffff9fと
intが32ビットであるような環境では、4バイトで表示されます。
88 9fと表示させたければ、xをunsigned charで宣言してください。
printfの中でキャストしても構いません。
シフトJISはエンディアンの概念ではなく、第一バイト、第二バイト(1バイト目、2バイト目)といった呼び方をします。
「'亜'は1バイト目が0x88、2バイト目が0x9f」など。
回答ありがとうございます。
なるほど。完全にわかりました。
*x、つまり0x88自体には型がないということですな。
そして0x88は2の補数表現では-120を表す!
そしてprintfの変換指定子%xはint型専用なのですね!
(長さ修飾をしない場合)
ご指摘の通り変更したらうまくいきました。
ありがとうございます。
No.3
- 回答日時:
一応念の為:
「unsignedが指定されていないchar型つまりsigned」という表現は正しくありません. 一般的には「ただの char が signed か unsigned か」は環境に依存します.
この質問者の環境では signed ですが.
この回答への補足
0x88の型はありますね。char型ですね。char x[5] = "亜"; は
x[0] = 0x88, x[1] = 0x9f; と代入することと同じだから。x[2] ? x[4]は0。
ここで問題なのはprintfの変換指定子%xに長さ修飾子がないと(そのままだと)
int型として拡張表示してしまうこと。そしてマイナスだから1で拡張される。
例えばint型の上位2バイトを出力しようとしたとき
char型で指定しないと2バイト読んでくれないので
型がないということはあり得ることなのか、と思いました。
No.1
- 回答日時:
> (1)「88 9f」と表示されないのはなぜですか?
汎整数拡張されるから。
> (2)4バイトで表示される理由。char型は1バイトでした。
汎整数拡張されるから。
汎整数拡張の説明は各種解説サイトに譲ります。(検索したら見つかると思う。)
> (3)また、リトルエンディアンなので「9f 88」と表示されないのはなぜですか。
文字コードとエンディアンは関係ありません。
もし、9fと88が入れ替わったりしたら、それはもはやShift JISでは無くなってしまいます。
(UTF-16の様にエンディアンの概念を持つ文字コードもあるけど、
整数型のエンディアンとはまた別。)
回答ありがとうございます。
汎整数拡張はなかなかむずかしいですね。
文字コードではデータをキャストしたりしないので
使うメリットはないですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
通貨型はバイト型に変換可能?
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
GetWindowTextでアドレスバーか...
-
バイト配列 抜き出す
-
char str[256]の256の意味は?
-
COBOLのCOMP形式について
-
テキストBOXの入力制限について
-
文字のバイトサイズの取得
-
正規表現が得意なかた教えてく...
-
構造体へのポインタ変数
-
文字が正しく表示されない
-
0.5バイトづつ読み込みたいので...
-
全角文字の符号化(半角文字で...
-
(C#)1バイトの正規表現
-
w3cの使い方について
-
memcmp バイナリデータの比較方法
-
半角、全角の判別方法
-
VBAでShift-JISのURLエンコード
-
javaでアップロード時、SJIS文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
バイト列とバイナリ列の違いが...
-
VBAでShift-JISのURLエンコード
-
機種依存文字をチェックしたい。
-
ピクセル,dpiから容量(バイト...
-
GetWindowTextでアドレスバーか...
-
この関数はどのプログラミング...
-
ソケット通信の受信サイズ
-
:(コロン)のKeyCode
-
COBOL PICTUREで X,S,Vの意味
-
memcmp バイナリデータの比較方法
-
より高速な画像の表示法
-
半角、全角の判別方法
-
最大長を用意せずにバイナリデ...
-
64bit対応
-
バイナリとBCDコード
おすすめ情報