c++ - Is `long` guaranteed to be at least 32 bits? -


by reading of c++ standard, have understood sizes of integral fundamental types in c++ follows:

sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int) 

i deduced 3.9.1/2:

  1. there 4 signed integer types: “signed char”, “short int”, “int”, , “long int.” in list, each type provides @ least storage preceding in list. plain ints have natural size suggested architecture of execution environment

further, size of char described 3.9.1/ being:

  1. [...] large enough store member of implementation’s basic character set.

1.7/1 defines in more concrete terms:

  1. the fundamental storage unit in c + + memory model byte. byte @ least large enough contain member of basic execution character set , composed of contiguous sequence of bits, number of implementation-defined.

this leads me following conclusion:

1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int) 

where sizeof tells how many bytes type is. furthermore, implementation-defined how many bits in byte. of used dealing 8-bit bytes, standard says there n bits in byte.


in this post, alf p. steinbach says:

long guaranteed (at least) 32 bits.

this flies in face of understand size of fundamental types in c++ according standard. discount statement beginner being wrong, since alf decided worth investigating further.

so, you? long guaranteed standard @ least 32 bits? if so, please specific how guarantee made. don't see it.

  1. the c++ standard says in order know c++ must know c (1.2/1) 1

  2. the c++ standard implicitly defines minimum limit on values long can accommodate long_min-long_max 2

so no matter how big long is, has big enough hold long_min long_max.

but alf , others specific long must @ least 32 bits. i'm trying establish. c++ standard explicit number of bits in byte not specified (it 4, 8, 16, 42) how connection made being able accommodate numbers long_min-long_max being @ least 32 bits?


(1) 1.2/1: following referenced documents indispensable application of document. dated references, edition cited applies. undated references, latest edition of referenced document (including amendments) applies.

  • iso/iec 2382 (all parts), information technology – vocabulary
  • iso/iec 9899:1999, programming languages – c
  • iso/iec 10646-1:2000, information technology – universal multiple-octet coded character set (ucs) – part 1: architecture , basic multilingual plane

(2) defined in <climits> as:

long_min -2147483647 // -(2^31 - 1) long_max +2147483647 //   2^31 - 1 

c++ uses limits defined in c standard (c++: 18.3.2 (c.limits), c: 5.2.4.2.1):

long_min -2147483647 // -(2^31 - 1) long_max +2147483647 //   2^31 - 1 

so guaranteed long @ least 32 bits.

and if want follow long circuitous route whether long_min/long_max representable long, have @ 18.3.1.2 (numeric.limits.members) in c++ standard:

static constexpr t min() throw(); // equivalent char_min, shrt_min, flt_min, dbl_min, etc. static constexpr t max() throw(); // equivalent char_max, shrt_max, flt_max, dbl_max, etc. 

i moved footnotes comment, it's not appears in standard. implies std::numeric_limits<long>::min()==long_min==(long)long_min , std::numeric_limits<long>::max()==long_max==(long)long_max.

so, though c++ standard not specify bitwise representation of (signed) negative numbers, has either twos-complement , require 32-bits of storage in total, or has explicit sign bit means has 32-bits of storage also.


Comments

Popular posts from this blog

asp.net - repeatedly call AddImageUrl(url) to assemble pdf document -

java - Android recognize cell phone with keyboard or not? -

iphone - How would you achieve a LED Scrolling effect? -