1

数値をループして、その整数の文字配列表現を作成するコードがあります。したがって、1234のような数値の場合、{'1'、 '2'、 '3'、'4'}のような配列が得られます。

コードの一部を以下に示します。

do {
   //print here
     c[i++] = (char)(((int)'0')+(num - (num/10)*10 ));
} while ((num = num/10) != 0);

long long int:18446612134627563776のような大きなデータ型に関しては問題があります

ループ内の値を出力しました:

18446612134627563776
18446730879801352832
18446742754318731738
...
18446744073709551615

値は次のようになります

18446612134627563776
1844661213462756377
184466121346275637
...
18
1

奇妙なことに、ループが終了します。最後に出力された値はです18446744073709551615 != 0ので、なぜそこで終了したのかわかりません。私が正しくやっていないデータ型の問題だと思います。

これはprintステートメントです:

printk("long=%llu sec=%llu , char=%c\n", num, (num/10)*10, (char)(((int)'0')+((num - (num/10)*10 ))));
4

4 に答える 4

2

あなたのコードは問題ありません。問題は、 の型numが署名されている (つまり、 だけであるlong long) ことです。( ) に変更すると、準備unsigned long long完了です。

于 2012-12-07T23:19:27.180 に答える
1

long long int: 18446612134627563776

long long int符号付きの型で、通常は 64 ビット幅で、表現可能な最大数を持ちます

2^63-1 = 9223372036854775807

あなたの値はそれよりも大きく、オーバーフローします。

2^63 - 18446612134627563776 = -131939081987840

印刷された値は

2^64 + (-131939081987840)/(10^k)

unsigned long long期待される結果を得るには、タイプを に変更します。

于 2012-12-07T23:20:01.640 に答える
0

オーバーフローすることはありません。このコードでテストしました。

unsigned long long num = 18446612134627563776;
char c[100];
unsigned int i = 0;

do {
    //print here
    c[i++] = '0'+ (char)(num - (num/10)*10 );
} while ((num = num/10) != 0);

c[i] = '\0';
cout << c << endl;

問題は、コンパイラがおそらく10をintとして使用しようとしており、変換に問題があることです。鋳造物を入れた後、それは実際に機能します。問題は、アルゴリズムが6、次に7などをもたらすため、逆方向になっていることです。上記のコードからの出力は、キャストを除いて彼とまったく同じです。

これは実際のコードであり、実際の出力です。

677365726431221664481

お役に立てれば :-)

于 2012-12-07T23:25:36.950 に答える
0

モジュロ演算子を使用して除算の剰余を計算し、最後の桁を取得してみませんか?

以下の整数

do {
    c[i++] = (char)(((int)'0')+(num %10 ));
} while ((num = (num/10)) != 0);
于 2012-12-07T23:11:25.713 に答える