• ベストアンサー

int型変数をchar型変数に格納する方法

int型数値をchar型変数に格納したいのですが、 sprintf()とatoi()を用いてやりましたが、 うまくいきません。 考えたコードを下記します。 int get_y(){ int y=2005; return y; } int main(){ char year; char str[5]; //intをcharに変換して格納している sprintf(str,"%d",get_y()); //数値として代入 year=atoi(str); //yearには2005が格納されていない! cout<<year<<endl; char ans; //このchar型変数に数値を代入する。 ans=year; cout<<ans<<endl; return 0; } お手数をお掛けしますが、 よろしくお願い致します。

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

  • ベストアンサー
  • PG_RankB
  • ベストアンサー率40% (12/30)
回答No.5

私にも2005が6を返すと言う意味が分かりません。 char型は先の説明にある通り、-128~127までしか、値を入れる事は出来ません。 char yearに127を格納すれば、127と出ますが、128と入れれば、ぐるっと一周して-128となってしまいます。 それで言うと、2005を代入すると、グルグルと周って-43と出ます。それならまだ分かるのですが・・・ 32ビット環境で、符号付きで考えたとき、 char 1バイト(-128~127) short 2バイト(-32768 ~ 32767) int 4バイト(-2147483648 ~ 2147483647) までしか入れられない。と言う事はお分かりでしょうか? 2005と言う数値をどんなにキャストしようが、char型の変数にその値を格納する事は出来ません。 get_y()が返す値を-128~127の値になるようにするか、yearをcharでは無く、shortやint型に素直に変更する必要があります。 2005をどうしてもcharに格納したいのなら、それは不可能です。

その他の回答 (5)

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

意図がよくわかりませんが、普通はcharとintでは表現範囲が異なるので、値を構成するビットパターンの一部が脱落するなどします。 char型というのは、処理系に依存する部分がかなりあります。まず、符号付きか符号なしかが処理系に依存しています(同じコンパイラでもオプションによって変わったりします)。 符号付きの場合、char型の表現範囲は少なくとも-127~+127(C言語では、負の整数値の内部表現に2の補数以外に、1の補数や、符号ビットと絶対値を使うことも出来るため)であり、符号なしの場合は少なくとも0~255になります。 int型の表現範囲は、少なくとも-32767~+32767になります。 したがって、処理系によってはchar型とint型の表現範囲が同じになることもありえますし、同じでなくても、どちらも2005を表現できるだけの大きさを持っている可能性もあります。また、char型とint型のサイズが同じで、かつchar型が符号なしの場合は、char方の方がint型より大きい値を格納することが出来る可能性さえあります。 今回の場合、2005が格納されていないようなので、やはりchar型では2005が表現できないのだと思います。 2005が6を返すという意味は、他の回答者同様、理解できませんでした。

noname#30727
noname#30727
回答No.4

2005がchar型変数には入らない事がわかっていてchar型にする意味がわかりません。 int型とchar型の配列(文字列)の相互変換をしたいって事ではないのですか? あと、気になった所が1つ。 >cout<<ans<<endl; ansはchar型なので数値としては表示されません。 cout << (int)ans << endl;

  • qwertyf
  • ベストアンサー率51% (14/27)
回答No.3

まず、char 型及び int 型に格納できる数値について、 char … -128 ~ 128 int … -2147483648 ~ 2147483647      (↑ 32bitコンパイラの場合。16bitでは -32768 ~ 32767) となっています。 つまり、char 型の変数には -128 より小さい値や 127 より大きい値を代入することが出来ません。 従ってどのような方法であれ、char 型の変数 year や ans に 2005 を代入することは出来ません。 atoi(str) の戻り値として int 型の数値 2005 が返ってきますが、 これを char 型変数 year に格納する時点で 2005 という数値の情報の 一部が削られ、予期しない値となって year に格納されます。 >もし、2005が6と言う数値を返す場合は、どのようにしたらいいでしょうか? get_y() が 2005 の代わりに 6 という数値を返す、という意味でしょうか? それだったら 6 は char 型の変数に格納できる数値ですので、 正常に動く(=6と表示される)と思います。 そもそも char 型に変える意味が分からないのですが、 get_y() 関数が -128 ~ 127 の値を返すことが保証されているのならば単に year = (char)get_y(); で済みます。

  • galoon
  • ベストアンサー率28% (38/133)
回答No.2

#1です。 「2005が6を返す」という状態が判然としませんが、2005という数値の部分が6という数値に変わった場合を表すのであれば現状の方法でも動作するように思います。ただ、コンパイラによってはキャストをしないと数値が変わるかも。 ans = (char)get_y(); でいけるかもしれません。(環境が無く確認をとってないため嘘かも。失礼)

  • galoon
  • ベストアンサー率28% (38/133)
回答No.1

int型とchar型では表現できる数値の範囲が違います。 int → -32768~0~32767 (最近は -65536~0~65535 の環境もある) char → -128~0~127 2005 という数値はchar型では表現できませんので期待する数値になっていないのではないでしょうか。

the-ai
質問者

補足

もし、2005が6と言う数値を返す場合は、どのようにしたらいいでしょうか? よろしくお願い致します。