2

いくつかのコードを機能させようとしていますが、モジュラスは私がやりたいことをしたくありません...つまり、私は間違っています。

unsigned charアスキーで画面に表示できるように、時間/分/秒を分離しようとしているs があります。

変数secsunsigned int. 他のすべてはunsigned char. unsigned charメモリを無駄にしないように、結果を s にしたい。組み込み環境での作業。

コード スニペットを見て、私が間違ったことを教えてくれる人はいますか?

hours   = secs/3600.0;
minutes =(secs/60.0)-(hours*3600);
seconds =secs-(hours*3600)-(minutes*60);

sec_ones    =(unsigned char)((seconds%10));
sec_tens    =(unsigned char)((seconds-sec_ones)%100);
min_ones    =(unsigned char)(minutes%10);
min_tens    =(unsigned char)((minutes-min_ones)%100);
hrs_ones    =(unsigned char)(hours%10);
hrs_tens    =(unsigned char)((hours-hrs_ones)%100);
4

4 に答える 4

2
minutes =(secs/60.0)-(hours*3600);

する必要があります

minutes =(secs/60.0)-(hours*60);

それ以外は、十分に小さい入力で機能します: http://ideone.com/VPKP1

変えたいところもあるけど。たとえば、二重除算を行ってから結果を に代入しても意味がありunsigned charません。整数除算を行うこともできます。

于 2012-05-31T10:12:40.537 に答える
1

あなたはそれが組み込みプログラムであると述べました。

seconds = secs-(hours*3600)-(minutes*60);

hoursは、式でunsigned char昇格されたです。inthours*3600

16 ビットで作業している場合int、上記の行で問題が発生します。2 の補数システムでは、16 ビットのint範囲が から-32768に移動します。32767これは、 が のときにオーバーフローが発生することを意味し hoursます>= 10

于 2012-05-31T10:12:20.770 に答える
0

あなたのプログラムは書き方が悪いだけです。それを試してみてください。正しく実行されます

unsigned int secs = 5000;
unsigned char sec_ones,sec_tens,min_ones,min_tens,hrs_ones,hrs_tens, hours, minutes, seconds;

hours   = secs/3600.0;
minutes =(secs/60.0)-(hours*60);
seconds =secs-(hours*3600)-(minutes*60);

sec_ones    =(unsigned char)((seconds%10));
sec_tens    =(unsigned char)(seconds/10);
min_ones    =(unsigned char)(minutes%10);
min_tens    =(unsigned char)(minutes/10);
hrs_ones    =(unsigned char)(hours%10);
hrs_tens    =(unsigned char)(hours/100);

printf("%.1u%.1u:%.1u%.1u:%.1u%.1u\n",hrs_tens,hrs_ones,min_tens,min_ones,sec_tens,sec_ones );
于 2012-05-31T10:09:56.813 に答える
0

まず、定数doubleを使用しているため、計算を行います。double

unsigned char狭いタイプであるため、係数の計算は行われません。通常、最初に昇格されてからint計算が行われます。

通常unsigned int、すべての変数に直接使用することをお勧めします。charタイプは、スペースを節約したい場合にのみ役立ちます。

于 2012-05-31T09:45:06.550 に答える