以下の同一の操作が2つの異なる出力を報告する理由を理解できませんでした。numが負の値であると宣言され、そのnumをbaseAddrに追加すると、addrが32ビットの範囲を超えていることがわかります。一方、numを正の値に宣言して減算を実行すると、正しい結果が得られます。つまり、結果の出力は正確に報告されます。誰かが以下の計算の何が問題になっているのか説明できますか?
/* Architecture is powerpc. Program cross-compiled for powerpc. Gcc Version- 4.6.2 */
#include <stdio.h>
typedef unsigned long long u_int64;
typedef unsigned long u_int32;
int main() {
u_int64 baseAddr = 0x8e008128;
u_int32 num = -360;
u_int64 addr = baseAddr + num;
printf("\nAddr 1st step = 0x%llx\n", addr);
/* Same operation, but slightly different */
num = 360;
addr = baseAddr - num;
printf("\nAddr 2nd step = 0x%llx\n", addr);
return 0;
}
/* Output:
Addr printed is 0x18e007fc0, but I need just 0x8e007fc0
/diagsk10copy/bin # ./e500GPR
Addr 1st step = 0x18e007fc0 //Wrong
Addr 2nd step = 0x8e007fc0
*/