There is more information stored in ladder memory than just the code you see. Each code-block has start/end delimiter instructions, along with the list of rung handles (one opcode for every 2 rungs). There are also hidden code blocks (but those are mostly constant, but can change based on what you are doing).
Also, until you write to the PLC, we don't know the precise number because some optimization/tweaking does occur at download time, and we end up with the actual buffer of DWORD opcodes, THEN we know EXACTLY how big your program is.