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になりません。

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/04/24 23:37:43

ベストアンサー

id:Bookmarker No.2

回答回数191ベストアンサー獲得回数34

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

id:fjdsfjdsaf

どうやら、Windows7付属の計算機に貼り付けて、
1844674407370955161=0x1999999999999999
を結果だと勘違いしていました。

計算機を以下のものを使用すると問題ありませんでした。
C電卓
http://www.vector.co.jp/soft/win95/personal/se345870.html

2012/04/24 23:39:40

その他の回答2件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

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

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

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

id:fjdsfjdsaf

回答ありがとうざいます。

どうやら、Windows7付属の計算機に貼り付けて、
1844674407370955161=0x1999999999999999
を結果だと勘違いしていました。

ありがとうございました。

2012/04/24 23:36:27
id:Bookmarker No.2

回答回数191ベストアンサー獲得回数34ここでベストアンサー

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

id:fjdsfjdsaf

どうやら、Windows7付属の計算機に貼り付けて、
1844674407370955161=0x1999999999999999
を結果だと勘違いしていました。

計算機を以下のものを使用すると問題ありませんでした。
C電卓
http://www.vector.co.jp/soft/win95/personal/se345870.html

2012/04/24 23:39:40
id:Bookmarker No.3

回答回数191ベストアンサー獲得回数34

-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;
}

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません