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になりません。
なにか間違っているでしょうか?
18446744073709551615 = 0xFFFFFFFFFFFFFFFF ですので、プログラムした通りの結果になっています。printf()で直接16進で表示してみてください。
0x1999999999999999 というのは、Windows付属の電卓など64ビットに対応していない計算機に貼り付けて、最下位の「5」が欠けた状態で計算していませんか?
-1の64bitでの2の補数表現なら、64bitすべてが1であっていませんか?
元が符号付だから最上位bitは符号で数値は63bitだと考えるとしても、
http://www9.plala.or.jp/sgwr-t/detail/TypeConversion.html
A + (Bの型の表現しうる最大値+1)
と、キャストで桁が拡張されるので、やはりすべての桁が1なので、18446744073709551615というのであっています。
回答ありがとうざいます。
どうやら、Windows7付属の計算機に貼り付けて、
1844674407370955161=0x1999999999999999
を結果だと勘違いしていました。
ありがとうございました。
18446744073709551615 = 0xFFFFFFFFFFFFFFFF ですので、プログラムした通りの結果になっています。printf()で直接16進で表示してみてください。
0x1999999999999999 というのは、Windows付属の電卓など64ビットに対応していない計算機に貼り付けて、最下位の「5」が欠けた状態で計算していませんか?
どうやら、Windows7付属の計算機に貼り付けて、
1844674407370955161=0x1999999999999999
を結果だと勘違いしていました。
計算機を以下のものを使用すると問題ありませんでした。
C電卓
http://www.vector.co.jp/soft/win95/personal/se345870.html
-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; }
どうやら、Windows7付属の計算機に貼り付けて、
2012/04/24 23:39:401844674407370955161=0x1999999999999999
を結果だと勘違いしていました。
計算機を以下のものを使用すると問題ありませんでした。
C電卓
http://www.vector.co.jp/soft/win95/personal/se345870.html