Highest value of int type in C/C++. Why can't I calculate it correctly in this example? -
in example program print out powers of 2 highest possible integer value run confusing result.
the integer variables signed, highest bit used sign. on machine size of integer 4 bytes, i.e. 32 bits. expected highest possible integer value 2^31.
confusing me following: highest integer value can calculate 2^30. result shows 2^31 minimum integer value , not maximum. moreover, 2^32 should exceed max integer value , expected unpredicable result. instead 0.
example in c:
#include <stdio.h> #include <limits.h> int main(void) { int exp; int pow = 1; (exp = 0; exp < 33; exp++) { printf("2 power of %d %d\n", exp, pow); pow *= 2; } printf("%d\n", int_min); printf("%d\n", int_max); return 0; } example in c++:
#include <iostream> #include <limits> using namespace std; int main(void) { int pow = 1; (int exp = 0; exp < 33; exp++) { cout << "2 power of " << exp << " " << pow << endl; pow *= 2; } int imin = std::numeric_limits<int>::min(); // minimum value int imax = std::numeric_limits<int>::max(); cout << imin << endl; cout << imax << endl; return 0; } output in both examples same:
2 power of 0 1 2 power of 1 2 2 power of 2 4 2 power of 3 8 2 power of 4 16 2 power of 5 32 2 power of 6 64 2 power of 7 128 2 power of 8 256 2 power of 9 512 2 power of 10 1024 2 power of 11 2048 2 power of 12 4096 2 power of 13 8192 2 power of 14 16384 2 power of 15 32768 2 power of 16 65536 2 power of 17 131072 2 power of 18 262144 2 power of 19 524288 2 power of 20 1048576 2 power of 21 2097152 2 power of 22 4194304 2 power of 23 8388608 2 power of 24 16777216 2 power of 25 33554432 2 power of 26 67108864 2 power of 27 134217728 2 power of 28 268435456 2 power of 29 536870912 2 power of 30 1073741824 2 power of 31 -2147483648 2 power of 32 0 -2147483648 2147483647
signed integer overflow.
it's undefined behavior. getting 0 valid undefined result.
the largest integer in int.
it's 2^31 - 1, not 2^31. note int_max odd number.
two's complement
most systems ever encounter won't use signed magnitude represent signed numbers. instead use two's complement.
Comments
Post a Comment