答えは、入力の下位 31 ビットが何を表すかによって異なります。
int input = 0x6FD40640 & 0x7FFFFFFF; //strip top bit; only here for clarity
符号なし入力:0x6FD40640 == 1876166208
2 の補数 (望ましい出力: -271317440)
2の補数の整数は、-1 にすべてのビットが設定され、負の数がそこからカウントダウンされるものです。最初のビットは引き続き符号ビットとして機能します。
1000 -> -8
1001 -> -7
...
1110 -> -2
1111 -> -1
0000 -> 0
0001 -> 1
下位 31 ビットが 2 の補数の整数を表す場合、これを実行できるはずです。
input = (input << 1) >> 1;
これは、Java が内部的に整数を 2 の補数で格納するためです。符号ビットが取得され、整数が 31 ビットから 32 ビットになるように、左にシフトしてから右にシフトする (符号付き) だけです。
1 の補数 (目的の出力: -802424384)
1の補数表現は、最初のビットが専用の符号ビットで、残りのビットが大きさを表すものです。-100 の下位ビットは、100 の下位ビットと同じになります。
1111 -> -7
1110 -> -6
...
1001 -> -1
1000 -> -0 (anomoly)
0000 -> 0
0001 -> 1
下位 31 ビットが1 の補数の整数 (つまり、符号ビットの後に符号なしの大きさを表す 30 ビットが続く) を表す場合、Java が値を適切に抽出できるように、それを 2 の補数に変換する必要があります。これを行うには、下位 30 ビットを抽出して -1 を掛けるだけです。
if ( input & 0x40000000 ) {
input = (input & 0x3FFFFFFF) * -1;
}
あなたは質問のコメントで、度に変換した後(3600000で割った後)、約-75.36になると言いました。 -271317440 を 3600000 で割ると、 -75.36595555555556 が得られるので、入力形式は 2 の補数であると推測しているため、最初の元の答えは正しかったです。