--- LIMITS.cpp (revision 624452)
+++ LIMITS.cpp (working copy)
@@ -223,13 +223,27 @@
return bits;
}
+template <class T>
+unsigned compute_byte_size()
+{
+ T max = T (one);
+ unsigned byte = 1;
+ for (int i = 1; T (max * two) > max; max *= two, i++) {
+ if (i > 8 ) {byte++; i = 1; }
+ }
+ return byte;
+}
+
// used to compute the size of a pointer to a member function
struct EmptyStruct { };
// to silence printf() format comaptibility warnings
#define SIZEOF(T) unsigned (sizeof (T))
+
+// to not include possible bit padding
+#define CALC_SIZEOF(T) compute_byte_size<T>()
int main ()
@@ -243,17 +257,17 @@
#ifndef _RWSTD_NO_BOOL
printf ("#define _RWSTD_BOOL_SIZE %2u /* sizeof (bool) */\n",
- SIZEOF (bool));
+ CALC_SIZEOF (bool));
#endif // _RWSTD_NO_BOOL
printf ("#define _RWSTD_CHAR_SIZE %2u /* sizeof (char) */\n",
- SIZEOF (char));
+ CALC_SIZEOF (char));
printf ("#define _RWSTD_SHRT_SIZE %2u /* sizeof (short) */\n",
- SIZEOF (short));
+ CALC_SIZEOF (short));
printf ("#define _RWSTD_INT_SIZE %2u /* sizeof (int) */\n",
- SIZEOF (int));
+ CALC_SIZEOF (int));
printf ("#define _RWSTD_LONG_SIZE %2u /* sizeof (long) */\n",
- SIZEOF (long));
+ CALC_SIZEOF (long));
printf ("#define _RWSTD_FLT_SIZE %2u /* sizeof (float) */\n",
SIZEOF (float));
@@ -319,7 +333,7 @@
# define LLong long long
- printf ("#define _RWSTD_LLONG_SIZE %2u\n", SIZEOF (LLong));
+ printf ("#define _RWSTD_LLONG_SIZE %2u\n", CALC_SIZEOF (LLong));
const char llong_name[] = "long long";
@@ -332,7 +346,7 @@
# define LLong __int64
- printf ("#define _RWSTD_LLONG_SIZE %2u\n", SIZEOF (LLong));
+ printf ("#define _RWSTD_LLONG_SIZE %2u\n", CALC_SIZEOF (LLong));
const char llong_name[] = "__int64";
@@ -352,7 +366,7 @@
#ifndef _RWSTD_NO_WCHAR_T
printf ("#define _RWSTD_WCHAR_SIZE %2u /* sizeof (wchar_t) */\n",
- SIZEOF (wchar_t));
+ CALC_SIZEOF (wchar_t));
const char *suffix = "U";
if ((wchar_t)~0 < (wchar_t)0)