◇ uint256とは?

最大値を並べてみました。
uint32_t: 2^32 (0xFFFFFFFF)
uint64_t: 2^64 (0xFFFFFFFFFFFFFFFF)
uint256: 2^256 (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)

非常に大きな数を扱うことができる「独自定義のクラス」となります。
(“_t”が接尾にないのはそのためです)
operatorの作用によりuint32_tと同じ感覚で扱うことができますので、迷うことはありません。bitcoinのuint256は加法と減法のみのサポートでした。このためこちらのロジックを活用いたしまして 乗法・除法・剰余・べき乗・正負(int256)・群をサポートいたしました。

使いやすいライブラリです。uint8_tが32個 固定長で連結されている構造でそのアドレスを直接出して格納できるようになっております。そしてuint256自体を固定長のvectorとして扱うことができます。主にハッシュ計算の結果を収めるため使用頻度が非常に高く使いやすさは大事な点でした。
※ 64ビットより幅が広い数を代入する場合に限り0xからはじまる文字列を利用いたします。

◇ サンプルコード

uint256 hash = ~uint256(0);
hash -= uint256(12345678);
hash -= uint256("0x00002046b1c7938971a6089c7105fc15907b8f27ac8dfea9896c27c593a9a966");
::fprintf(stdout, "hash=0x%s\n", hash.ToString().c_str());

uint256 test1("0x00002046b1c7938971a6089c7105fc15907b8f27ac8dfea9896c27c593a9a966");
uint256 test2("0x000000000000000000000000000000000000000000000000000000000000a966");
test1 *= test2;
::fprintf(stdout, "test1=0x%s\n", test1.ToString().c_str());
test1 %= test2;
::fprintf(stdout, "test1=0x%s\n", test1.ToString().c_str());

test1.SetHex("0x00002046b1c7938971a6089c7105fc15907b8f27ac8dfea9896c27c593a9a966");
test1 /= test2;
::fprintf(stdout, "test1=0x%s\n", test1.ToString().c_str());

test2 ^= 8;
::fprintf(stdout, "test2=0x%s\n", test2.ToString().c_str());