

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;
}
お手数をお掛けしますが、
よろしくお願い致します。
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に格納したいのなら、それは不可能です。
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を返すという意味は、他の回答者同様、理解できませんでした。
No.4
- 回答日時:
2005がchar型変数には入らない事がわかっていてchar型にする意味がわかりません。
int型とchar型の配列(文字列)の相互変換をしたいって事ではないのですか?
あと、気になった所が1つ。
>cout<<ans<<endl;
ansはchar型なので数値としては表示されません。
cout << (int)ans << endl;
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();
で済みます。
No.2
- 回答日時:
#1です。
「2005が6を返す」という状態が判然としませんが、2005という数値の部分が6という数値に変わった場合を表すのであれば現状の方法でも動作するように思います。ただ、コンパイラによってはキャストをしないと数値が変わるかも。
ans = (char)get_y();
でいけるかもしれません。(環境が無く確認をとってないため嘘かも。失礼)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列をnビットシフトする
-
コンパイルエラー invalid ope...
-
strsetという関数
-
引数の渡し方と受け方(argv)
-
Win32APIでのエディットボック...
-
memset の第2引数の型
-
DxLibについて質問です
-
2進数でのシリアル通信
-
中置記法の問題なのですが…
-
for next文、do while文、if文...
-
ncursesで...
-
【至急】C言語の問題です、どな...
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
-
fgetsなどのときのstdinのバッ...
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
c言語プログラミング実行時エラ...
-
c++ 文字列を入力して、一文字...
-
【C言語】構造体内の領域解放(...
-
間接参照のレベルが異なっています
-
C言語の入力した文字を反転させ...
-
構造体のアライメント調整
-
strncpyと_tcsncpy_sのヌルの扱...
-
TCP/IP通信型大文字・小文字変...
-
char型からのバイト数取得
おすすめ情報