• ベストアンサー

Cの仕様で、確認の方法

C言語の仕様についてですが、文字から、整数に変換する時にビットはどのように変化するか、見たいのですがどうすればよいでしょか?<ctype.h>において、isspaceなどで、char型から、int型のように変換されると書いてあるが、その変化の過程を確認したいです。 気になっているのが、char型で最上位ビットが立っているときに、変換後符号拡張されるのか、それとも正の数になるのかということです。 どのような確認方法がありますでしょうか? まだ初心者の為、質問がわかりにくいと思います。 すみませんが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Largo_sp
  • ベストアンサー率19% (105/538)
回答No.3

プログラム書いてみればいいのでは? char d =0xA1 signed char c = 0xA1; unsigned char uc=0xA1; int i,ic,iuc; main() { i = (int) d; ic = (int) c; iuc = (int) uc; printf("i = %d ,ic = %d , iuc = %d ",i,ic,iuc); } かな? #2のかたの書き方がいいのかな?

2002hare
質問者

お礼

はい、上のような指定方法で理解できました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.5

char型がsiginedであるかunsignedであるかは環境(処理系実装またはコンパイルオプション)依存です。 char型がunsignedであるときは上位ビットに0が拡張されてint型に変換されます。 char型がsignedであるときは上位ビットは符号拡張されてint型に変換されます。 例外(負の表現が1の補数である場合の-0など)はありますが、一般的な処理系では上記のような変換となります。

2002hare
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

すみません、#1です。回答になってないですね。 引用:『プログラミング言語C』付録A6.1 文字、短整数あるいは整数のビット・フィールドは、符号付きも符号なしもすべて、列挙型とともに整数が使える式の中で使ってよい。もしも元の型のすべての値がintで表せるときにはその値はintに変換される。そうでないときにはunsigned intに変換される。この過程を「整数への格上げ」という。 :おわり だそうです。  ところが、文字はunsigned charか、signed charかは実装依存なので、文字の最上位ビットが立っていてもそれが符号を表すかどうかはコンパイラの仕様を調べてみないとわかりません。ただし、印字可能文字はすべて正の範囲に収まるようにという規則はあります。  実際には、コンパイラがはいたコードを逆アセンブルして、アセンブリでどう扱っているかみてみては如何でしょうか?

2002hare
質問者

お礼

教えて頂いたところを調べた所、そうのようになっていました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

自分でintを受け取る関数を作って、charを与えてみればわかります。下のプログラムでcharのかわりにunsigned char とか signed char を使ってみて比較しましょう。 現実的に多くは符号付きとして扱い、符号拡張されますが、厳密にはコンパイラ依存です。符号の有無に依存しそうなら、明示的にsigned charとかunsigned charを使いましょう。 void foo(int i) { printf("%d\n", i); } int main(void) { char c = 0xff; int i = c; printf("%d\n", i); foo(c); return 0; }

2002hare
質問者

お礼

ありがとうございました、その方法で解決できました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

こんにちは。 char型は1バイト。 int型は実装によるが、2バイト以上。 #『プログラミング言語C』第2版44ページより よってchar→int変換で符号ビットが問題になることはない。 と思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語の<ctype.h>のisspace()について教えてください。

    C言語の<ctype.h>のisspace()について教えてください。 まだ初心者なので、変な質問でしたらすみません。 ライブラリで用意されているisspace()関数があります。 空白類の文字判定を行えるとあり、引数はint型で指定することになっています。 そこで疑問なのですが文字列をgetcで取ってきた時にcはEOFの時にマイナスを取るわけですが、問題ないのでしょうか? 例えば int c; while( !isspace( c = getc( fp )) && c != EOF ){・・・ getcを(unsigned char)ででもキャストすると解消するとは思いますが、問題ないのならば加えたくありません・・。以上ですが、分かりにくい説明でご迷惑おかけします。 よろしくお願い致します。

  • ソフ開の問題集について

    こんにちは。さっそくですが質問させていただきます。 日高哲郎氏の著作 「2006秋 ソフトウェア開発技術者 午後問題集」 の第二章アルゴリズム 演習4 BNF についてなのですが、 構文規則で定義される 言語のなかで byte 8ビット 補数表現の整数 short 16ビット 補数表現の整数 char 16ビット 符号なし整数 int 32ビット 補数表現の整数 を扱うのようなのですが <演算子> の定義の中にシフト演算子があり、 '<<' 空いたビットに符号ビットを入れる '<<<' 空いたビットに 0 を入れる とありました。 ----------------------------------------------------- 設問4の(2) の問題文はつぎのようなものでした。 シフト演算子<< は(1)のように除算演算子で置き換え可能である [ (1) については省略させていただきます。] ~中略~ 除算演算子をシフト演算子に置き換え可能なのは 除数および被除数がどのような場合か ----------------------------------------------------- 正解は 除数 2 のべき乗のとき 被除数 char型で32767以下の場合、またはchar型以外のとき なのですが、これはそれぞれの型においての最上位ビットの 扱いからだと思うのですが、 ( char型以外は 2 の補数表現の整数 ) 質問させていただきたいのは本の正解に対する 解説についてなのです。 ----------------------------------------------------- 解説文においては 「・・・符号ビットを意識しないchar型であると 最上位ビットに 1 が入っていると右シフトの結果空いたビットに 0 が入ってしまうため数値としてみた場合、正しい結果が得られない。 ・・・」 とあるのですが、空いたビットに 0 が入れば数値として 正しくなるのではないでしょうか? そしてこの場合、char型の最上位ビットに 1 が入っていると シフトしたら、空いたビットに 1 が入るので数値としては 正しくなくなるのではないでしょうか? 自分の理解に自信が持てないので、このような質問を させていただきましたが、 ご存知のかた、教えていただけないでしょうか? よろしくおねがいします。

  • 固定長なデータ型の定義

    int型などは可変長型なのでサイズは16ビット、32ビット、 64ビットなどC言語だと環境によって異なってきますよね? さらにlong型は32ビット64ビットの可変長でも、 long long型は64ビット固定長型であったり、 long int型は32ビットが保証値だとか、 shortを付けるとサイズが小さくなるのかだとか、 非常に煩わしいのでどの環境でも常に同じサイズで定義できるよう 全てtypedefで固定長にしたいと考えています。 (できれば__int32等は言語仕様では無いので使いたくないので…) ですが検索するとどうも情報が各サイトごとに微妙に違ってたりして 私には正しいかどうかの判断が付かなくなってしまいました。 (C言語以外もあったのでそのせいかもしれませんが;) 以下のように、8ビット、16ビット、32ビット、64ビット、 32ビット浮動小数、64ビット浮動小数を定義したいのですが どうかアドバイスをいただけないでしょうか? 宜しくお願い致します typedef int8   signed char; // -127~127 typedef int16  //16ビット固定整数 typedef int32  //32ビット固定整数 typedef int64  //64ビット固定整数 typedef dec32  //32ビット固定浮動小数 typedef dec64  //64ビット固定浮動小数

  • 【C】引数の変換をする場合どちらの方法を使うべきでしょうか?

    int main(int argc, char* argv[]) { int i; /* argv[1]をintになおして格納用 */ 処理 } という感じでメインを作ると思いますが 引数のargv[0]はファイルの絶対パス argv[1]には"必ず"数字(整数)が入っていると仮定して argv[1]をint型に変換する場合 (1) sscanf(argv[1], "%d", &i); とするか (2) stdlib.hをインクルードして i = atoi(argv[1]); とするかの二通りをとりあえず思いついたのですが どちらもintに変換された値が入るわけですが C言語になれておられる方なら普通どちらをつかいますか? (1)or(2) 又はそれ以外の方法、どっちでも良し、場合によるetc... ご意見よろしくお願いします。

  • C言語のsendとrecv

    C言語でクライアントとサーバのプログラムを作りたいのですが、かなりの初心者なので、とりあえず練習用として、クライアント側に整数を入力すると、サーバ側でその整数を二乗して、結果をクライアント側に返すという簡単なプログラムを作ろうと思いました。 ソケットの作成、通信ドメインの指定等は、参考書を見ながら(というか、ほとんど丸写しみたいな感じなんですが…)、なんとかできたんですが、sendとrecvで整数を送受信するにはどうすればいいのかが分かりません。 私が持っている参考書には、 int send(SOCKETS const char FAR *buf int len int flags); int recv(SOCKETS char FAR *buf int len int flags); とあるのですが、const char FAR *buf、int len、char FAR *bufのところがよく分からないのです。 例えば、a=1000を送信したい場合、aはchar型ではないのでsendでは送れないのですか? ほんと初心者ですいませんが、どなたか教えてください。 よろしくお願いします。

  • C言語で整数を文字列へ型変換

    C言語で整数を文字列へ型変換 int result[11]; const char *tmp; resultの中の11個の数字を 1,2,3,4,5,6,7,8,9,10,11 のような文字列にして、tmpへ代入したんですが、やり方が分かりません。 Cの初心者ですので、教えていただきたいです。

  • 暗黙的型変換

    C の文法書を読んでいると、 汎整数型拡張: int より小さな汎整数型が式中に現れる場合は、暗黙的に int 型に変換される。 算術変換: 二項演算子で二つのオペランドの型が違う場合は、演算前により大きな方の型に暗黙的に変換される。 とあります。 例えば int 型 = unsigned short 型 - unsigned char 型; はどのように暗黙的な型変換が行われるのでしょう。 int 型 = (int)unsigned short 型 - (int)unsigned char 型; でしょうか。あるいは、 int 型 = (int) ( unsigned short 型 - (unsigned short)unsigned char 型); でしょうか。

  • 符号付32bit整数→16bit整数

    以前、Excel関数を使って上位、下位に分かれた符号付16bit整数を32bit符号付整数に変換する式を見つけ使用させていただき大変助かっています 今回はそのまったく逆でExcel関数を使って符号付32bit整数を上位、下位に分かれた符号付16bit整数に分割したいのですが上手くいかずに困っています 解る方いらっしゃいましたら教えてください よろしくおねがいします

  • シフト演算子について・・・意味がわかりません(T_T)

    左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、 右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、 論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。 と、ここまではわかりました・・・ ある問題で int n = -1>> 31; でnはいくつになるか?というのがあったんですが、 解説の意味がわかりません。 回答はー1です。 「>>演算子によるシフトでは符号ビットが拡張される」 意味がわかりません・・・(@_@) 「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」 え・・・???!!! ふごーびっと??? シフト演算子ですから、 「-1の31こ右にビットをシフトする」 んだな・・・と思ったところ、 まったくどう考えてよいのかわからず、 回答を見たところ、余計わからなくなりました。 だれかたすけてください(T_T)

    • ベストアンサー
    • Java
  • char型の扱える範囲とは?

    整数をchar型にしたいと思い int a = 250; char b[1]; sprintf(b, %d, a); と書いたのですが, char型の扱える整数の範囲である-256~255のint型の整数しか char型にこの場合変換できないということでいいでしょうか? またint型に代入できる値は,32bit以内の整数という考えでいいですか?

このQ&Aのポイント
  • プリンター(DCP-J982N)のWi-Fi接続ができず、印刷できないトラブルに困っています。プリンター情報が取得できないエラーが表示され、Wi-Fi再設定しても改善されません。解決方法を教えてください。
  • Mac OSとiOSを使用しており、無線LAN経由でプリンターに接続しています。関連するソフトはブラザーアプリです。ひかり回線を使用しています。
  • 突然、プリンターのWi-Fi接続ができなくなりました。以前は正常に接続していましたが、ある日突然繋がらなくなりました。Wi-Fi再設定しても問題は解決しません。原因と解決方法を教えてください。
回答を見る