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.2
- 回答日時:
#1です。
「2005が6を返す」という状態が判然としませんが、2005という数値の部分が6という数値に変わった場合を表すのであれば現状の方法でも動作するように思います。ただ、コンパイラによってはキャストをしないと数値が変わるかも。
ans = (char)get_y();
でいけるかもしれません。(環境が無く確認をとってないため嘘かも。失礼)
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.4
- 回答日時:
2005がchar型変数には入らない事がわかっていてchar型にする意味がわかりません。
int型とchar型の配列(文字列)の相互変換をしたいって事ではないのですか?
あと、気になった所が1つ。
>cout<<ans<<endl;
ansはchar型なので数値としては表示されません。
cout << (int)ans << endl;
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を返すという意味は、他の回答者同様、理解できませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
strchr() の第2引数はなぜ int ...
-
CStringをwchar_tに変換したい
-
_TCHAR*での引数の読み込み
-
間接操作のレベルとは
-
fgetsなどのときのstdinのバッ...
-
c++ 文字列を入力して、一文字...
-
C言語の入力した文字を反転させ...
-
ftoa の作り方
-
標準ライブラリ関数の自作につ...
-
c言語です。
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
構造体のアライメント調整
-
間接参照のレベルが異なっています
-
文字列から空白を取り除きたい...
-
起動時の引数の取得方法が分か...
-
コマンドラインに入力されてい...
-
配列をnビットシフトする
-
RGB→YUV変換のプログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報