• ベストアンサー

2進数11111111を-1ではなく256と表示させたい

#include <windows.h> #include <math.h> CHAR inc2to16(const char *str2inc){ INT i, ans=0; //文字の長さがちょうど8かを調べる if(strlen(str2inc)!=8) return 0; //文字列が1と2で成り立っていない場合0を返す for(i=0 ; str2inc[i]!='\0' ; i++){ if(str2inc[i]!='1' && str2inc[i]!='0'){ return 0; } } //128 64 32 16 8 4 2 1 //文字列を16進数に直し、値を返す for(i=0 ; i<8 ; i++){//8回ループ if(str2inc[i]=='1'){ ans += pow(2, 7-i); } } return ans; } int main(int argc, char *argv[]){ if(argc==1) return 0; printf("%d", inc2to16(argv[1])); return 0; } 01111111 までは127と期待通りの結果が返ってくるのですが、 11111111や11111110 などになると、signed型と判断して、 printf("%d", inc2to16(argv[1]); ではマイナス表示になってしまいます。 %uにしてみても最上位1ビットが1のときは表示がとてつもなく大きくなりますし。。 解決策はありますか?

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

CHAR型というのが実際にはどんな型なのかわかりませんが、inc2to16関数の返却値型をint等にすれば多分解決すると思います。 使用されているコンパイラがC99対応であれば、"%hhu"にするのも一つの手です。 inc2to16関数の返却値を強制的にunsigned charでキャストしてもどうにかなりますが、あまりお勧めはしません。(絶対止めろというほどでもありませんが)

ggaogg
質問者

お礼

どっちの方法でもできました。 CHAR型というのはwindows.hかその中のインクルードファイルで #define CHAR char というようなかんじの、別称です。(符号なし1バイト) %hhuはできませんでした。 %hhuについて、printf関数調べてみたんですけど、これについての説明は見つけられませんでしたが、普通に使われてます。 よかったらこれも説明お願いしマス(TT

その他の回答 (3)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

> #define CHAR char > というようなかんじの、別称です。(符号なし1バイト) これだとcharはsignedじゃないかな。charが符号付きか符号なしかは処理系依存ですね。 > printf("%d", inc2to16(argv[1])); 手っ取り早く直すなら < printf("%d", inc2to16(argv[1])&0x000000ff); で良いのでは?

ggaogg
質問者

お礼

そうですね。調べたらchar型は既定で符号ありらしいです。 浅い知識で決め付けてました。 間違った知識が改善されました。ありがとうございます。 >printf("%d", inc2to16(argv[1])&0x000000ff); してることはわかるのですが、これでどうして正常になるのかがわからない(力不足)し、頭をかかえてしまうので、自分的には手っ取り早くないかもしれません。。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

inc2to16 が符号なしの値を返すんだったら, char ではなく unsigned int とかを返すように定義しましょう.

ggaogg
質問者

お礼

戻り値の型を、unsigned intではなく、unsigned char型にしてもうまくいきました。ありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> %hhuについて、printf関数調べてみたんですけど、これについての説明は見つけられませんでしたが、普通に使われてます。 > よかったらこれも説明お願いしマス(TT 先にも書いたように、"%hhu"はC99でなければ使えません。C99に(特にライブラリ面で)完全対応している処理系はあまりないので、質問者さんが使われているものも対応していなかったのでしょう。

ggaogg
質問者

お礼

Visual C++ Toolkit 2003は使えないみたいですね。。 C99について調べたら、1999年に定められた?ようなことが書いてあったので、もうとっくにほとんどのコンパイラはサポートしているのかと思ってしまいました。 無知ぶりに呆れず答えてくださってありがとうございました。