Home | History | Annotate | Download | only in lib
      1 /* intprops.h -- properties of integer types
      2 
      3    Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
      4 
      5    This program is free software: you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation; either version 3 of the License, or
      8    (at your option) any later version.
      9 
     10    This program is distributed in the hope that it will be useful,
     11    but WITHOUT ANY WARRANTY; without even the implied warranty of
     12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13    GNU General Public License for more details.
     14 
     15    You should have received a copy of the GNU General Public License
     16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     17 
     18 /* Written by Paul Eggert.  */
     19 
     20 #include <limits.h>
     21 
     22 /* The extra casts in the following macros work around compiler bugs,
     23    e.g., in Cray C 5.0.3.0.  */
     24 
     25 /* True if the arithmetic type T is an integer type.  bool counts as
     26    an integer.  */
     27 #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
     28 
     29 /* True if negative values of the signed integer type T use two's
     30    complement, ones' complement, or signed magnitude representation,
     31    respectively.  Much GNU code assumes two's complement, but some
     32    people like to be portable to all possible C hosts.  */
     33 #define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
     34 #define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
     35 #define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
     36 
     37 /* True if the arithmetic type T is signed.  */
     38 #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
     39 
     40 /* The maximum and minimum values for the integer type T.  These
     41    macros have undefined behavior if T is signed and has padding bits.
     42    If this is a problem for you, please let us know how to fix it for
     43    your host.  */
     44 #define TYPE_MINIMUM(t) \
     45   ((t) (! TYPE_SIGNED (t) \
     46 	? (t) 0 \
     47 	: TYPE_SIGNED_MAGNITUDE (t) \
     48 	? ~ (t) 0 \
     49 	: ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
     50 #define TYPE_MAXIMUM(t) \
     51   ((t) (! TYPE_SIGNED (t) \
     52 	? (t) -1 \
     53 	: ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
     54 
     55 /* Return zero if T can be determined to be an unsigned type.
     56    Otherwise, return 1.
     57    When compiling with GCC, INT_STRLEN_BOUND uses this macro to obtain a
     58    tighter bound.  Otherwise, it overestimates the true bound by one byte
     59    when applied to unsigned types of size 2, 4, 16, ... bytes.
     60    The symbol signed_type_or_expr__ is private to this header file.  */
     61 #if __GNUC__ >= 2
     62 # define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t))
     63 #else
     64 # define signed_type_or_expr__(t) 1
     65 #endif
     66 
     67 /* Bound on length of the string representing an integer type or expression T.
     68    Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485;
     69    add 1 for integer division truncation; add 1 more for a minus sign
     70    if needed.  */
     71 #define INT_STRLEN_BOUND(t) \
     72   ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \
     73    + signed_type_or_expr__ (t) + 1)
     74 
     75 /* Bound on buffer size needed to represent an integer type or expression T,
     76    including the terminating null.  */
     77 #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
     78