人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

64bitの2の補数計算プログラム

int64_tで定義した変数をuint64_t
に代入したいと思っています。
2の補数として代入したいのですが、

int main(void){
int64_t n=-1;
uint64_t p=(uint64_t)n;

printf( "p=%llu\n" ,p );
return 0;
}

g++ test.cpp
./a.out
p=18446744073709551615

pを16進数で表すと、0x1999999999999999となってしまい、
求める補数0x7FFFFFFFFFFFFFFFになりません。

なにか間違っているでしょうか?


●質問者: fjdsfjdsaf
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● TransFreeBSD

-1の64bitでの2の補数表現なら、64bitすべてが1であっていませんか?
元が符号付だから最上位bitは符号で数値は63bitだと考えるとしても、
http://www9.plala.or.jp/sgwr-t/detail/TypeConversion.html

A + (Bの型の表現しうる最大値+1)

と、キャストで桁が拡張されるので、やはりすべての桁が1なので、18446744073709551615というのであっています。


fjdsfjdsafさんのコメント
回答ありがとうざいます。 どうやら、Windows7付属の計算機に貼り付けて、 1844674407370955161=0x1999999999999999 を結果だと勘違いしていました。 ありがとうございました。

2 ● しおり
ベストアンサー

18446744073709551615 = 0xFFFFFFFFFFFFFFFF ですので、プログラムした通りの結果になっています。printf()で直接16進で表示してみてください。
0x1999999999999999 というのは、Windows付属の電卓など64ビットに対応していない計算機に貼り付けて、最下位の「5」が欠けた状態で計算していませんか?


fjdsfjdsafさんのコメント
どうやら、Windows7付属の計算機に貼り付けて、 1844674407370955161=0x1999999999999999 を結果だと勘違いしていました。 計算機を以下のものを使用すると問題ありませんでした。 C電卓 http://www.vector.co.jp/soft/win95/personal/se345870.html

3 ● しおり

-1の2の補数を求めたいなら、以下のような感じです。

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

int main()
{
 int64_t n = -1;
 uint64_t p = (uint64_t)~n + 1;
 printf("n=0x%016" PRIX64 "\n", n);
 printf("p=0x%016" PRIX64 "\n", p);
 return 0;
}
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ