3

この C コードは負の数の絶対値を見つけようとしますが、出力も負になります。誰かがこれを克服する方法を教えてもらえますか?

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <inttypes.h>

int main() {
    int64_t a = 0x8000000000000000;
    a = llabs(a);
    printf("%" PRId64 "\n", a);
    return 0;
}

出力

-9223372036854775808

アップデート:

ご回答ありがとうございます。これが標準外の値であることを理解しています。そのため、絶対的な操作を行うことができません。ただし、遺伝的プログラミング シミュレーションである実際のコードベースでこれに遭遇しました。この「生物」はC標準について知らず、この値を生成することを主張します:)これを回避する効率的な方法を誰か教えてもらえますか? 再度、感謝します。

4

5 に答える 5

1

最上位ビットがハイに設定され、他のすべてのビットがローに設定された符号付き整数は、その整数の絶対値と同じ型で表現できません。

8 ビット整数を観察する

int8_t x = 0x80; // バイナリ 1000_0000、10 進数 -128

8 ビットの符号付き整数は、-128 から +127 までの値を保持できるため、値 +128 は範囲外です。16 ビット整数の場合、これも同様に成立します。

int16_t = 0x8000; // バイナリ 1000_0000_0000_0000、10 進数 -32,768

16 ビット整数は、-32,768 から +32,767 までの値を保持できます。

このパターンは、2 の補数で表される限り、任意のサイズの整数に適用されます。これは、コンピューターにおける整数の事実上の表現です。2 の補数は、すべてのビットがローとして 0 を保持し、すべてのビットがハイとして -1 を保持します。

したがって、N ビットの符号付き整数は 2^(N-1) から 2^(N-1)-1 までの値を保持でき、符号なし整数は 0 から 2^N-1 までの値を保持できます。

于 2013-12-19T12:24:13.557 に答える