Hacker News new | ask | show | jobs
by Scene_Cast2 4519 days ago
The sum() example does not work as the article says it does. Under Visual Studio 2013 compiling for x86 (C++ compiler, but C++ also has integer promotion rules), the function returns zero. The reason is: 65535 = 2^16-1. uint16_t is signed, therefore it has 15 bits to represent the value. When executing "int16_t a = 65535;" under a debugger, "a" is set to -1.
3 comments

Thanks, I tested with GCC and Clang on Linux on 64-bit x86, GCC+OpenBSD on 32-bit+x86 and GCC+Linux on PowerPC 603. The point I was aiming for is that described operation is indeed undefined.
If uint16_t really is a signed 15bit value under VS2013, somebody in the compiler development department has a great sense of humor.
My bad - that's a typo. I meant int16_t, the same as in the sample code.
It's actually undefined behavior.