Optimizing away II.3
Posted by Dan Byström on January 1, 2009
Oh, the pain, the pain and the embarrassment…
I just came to realize that although a “long” in C# is 64 bits, in C++ it is still 32 bits. In order to get a 64 bit value in MSVC++ you must type either “long long” or “__int64”. I didn’t know that. 😦
This means that although the assembler function I just presented correctly calculates a 64 bit value, it will be truncated to 32 bits because the surrounding C++ function is declared as a long.
This in turn means that for bitmaps larger than 138 x 138 pixels – the correct result cannot be guaranteed. (With 64 bit values, the bitmap can instead be 9724315 x 9724315 pixels in size before an overflow can occur.)
Unfortunately, although I had unit test to verify the correctness of the function, I only tested with small bitmaps.
I have uploaded a new version. Ekeforshus
Optimizing away II « Dan Byström’s Bwain said
[…] Optimizing away II.3 […]
scaryreasoner said
“just came to realize that although a “long” in C# is 64 bits, in C++ it is still 32 bits.”
This is not a C++ (or C) thing. C (and therefore C++) doesn’t define exactly how big a long (or an int) is. For example, on Windows, a long is 32 bits whether running on x86, or on x86_64 — it’s the same on both. But, on linux, a long is 32 bits on x86, but 64 bits on x86_64.
If you want a particular size, include inttypes.h, or stdint.h (see the man page — oh yeah, windows doesn’t even have man pages — google it to see which suits you best) then use, e.g:
uint32_t
uint64_t
int32_t
int16_t
etc.
I think __int64 isn’t standard.
danbystrom said
Yes of course. It is not even an OS thing – it’s a compiler manufacturer thing. When I typed C++ I though that maybe I should be explicit and write MSVC++, but then I thought I was pretty obvious that that’s what I’m using. Thanks for making this completely clear – I have updated the post accordingly. In MSVC++ 1.52 an “int” was 16 bits and a “long” was 32 bits, but in the next version, 4.0, an “int” was changed to 32 bits. Somehow I just thought that a “long” would have been “modernized” during all those years… Here’s the whole truth for MSVC++: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx