Difficulty target representation in bitcoin wiki

The bitcoin wiki describes difficulty target representation as follows:

How is difficulty stored in blocks? Each block stores a packed representation (called "Bits") for its actual hexadecimal target. The target can be derived from it via a predefined formula. For example, if the packed target in the block is 0x1b0404cb, the hexadecimal target is

0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000

Note that the 0x0404cb value is a signed value in this format. The largest legal value for this field is 0x7fffff. To make a larger value you must shift it down one full byte. Also 0x008000 is the smallest positive valid value.

Why 0x008000 is the smallest positive valid value?

To explain that, let's look at the code that unpacks the compact format into a 256 bit int.

arith_uint256& arith_uint256::SetCompact(uint32_t nCompact, bool* pfNegative, bool* pfOverflow)
{
int nSize = nCompact >> 24;
uint32_t nWord = nCompact & 0x007fffff;
if (nSize <= 3) {
nWord >>= 8 * (3 - nSize);
*this = nWord;
} else {
*this = nWord;
*this <<= 8 * (nSize - 3);
}
if (pfNegative)
*pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0;
if (pfOverflow)
*pfOverflow = nWord != 0 && ((nSize > 34) ||
(nWord > 0xff && nSize > 33) ||
(nWord > 0xffff && nSize > 32));
return *this;
}

The first 8 bits here are the exponent. The next bit is a sign bit, with 1 being negative. The next 23 bits are the mantissa.

So, 0x00800000 is equal to 0x00000000.

• Yes 0x00800000 is equal to 0x00000000, but I think the wiki is referring to the part after the Bits removed the first byte, and it says 0x008000 instead of 0x800000 is the smallest positive valid value. – hello.wjx Sep 22 '16 at 12:03
• 0x008000 is also equal to zero, because it is right shifted three times. For that matter, 0x01008000 would equal zero too. – Nick ODell Sep 22 '16 at 17:57
• Then 0x007000, 0x006000 ... all equal to zero, and all are smaller than 0x008000 – hello.wjx Sep 23 '16 at 15:08