From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on ip-172-31-74-118.ec2.internal X-Spam-Level: * X-Spam-Status: No, score=1.0 required=3.0 tests=BAYES_40,FORGED_GMAIL_RCVD, FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.6 Path: eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.ada Subject: Re: C time_t 2038 problem s-os_lib.ads Date: Fri, 24 Sep 2021 15:54:10 -0700 Organization: None to speak of Message-ID: <87ilyplh4d.fsf@nosuchdomain.example.com> References: <8936f386-3fdb-43b3-b912-317906d59631n@googlegroups.com> <4431fad9-d297-4d68-8c0f-fa771c6710f6n@googlegroups.com> <874kabm5mp.fsf@nosuchdomain.example.com> <3c0272f8-4117-46a4-9051-5419d1edfdc6n@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: reader02.eternal-september.org; posting-host="eb687d1a85d0437d520958888fe2a804"; logging-data="662"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/39c113qbP7W6Nn4jw2bzd" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) Cancel-Lock: sha1:fvKuInDqPPLHxFMp3VsAO03qf/U= sha1:PYM2KyTuVjdlkLH8w1aNC88T/gs= Xref: reader02.eternal-september.org comp.lang.ada:62836 List-Id: Joakim Strandberg writes: >> In C and C++, int is required to be at least 16 bits (POSIX requires >> 32), long is at least 32 bits, and long long is at least 64 bits. On >> most 64-bit Linux-based systems, int is 32 bits, and long and long long >> are both 64 bits. On 64-bit MS Windows, int and long are both 32 bits, >> and long long is 64 bits. time_t is 64 bits on almost all 64-bit >> systems. I've never seen a 128-bit time_t; 64 bits with 1-second >> resolution is good for several hundred billion years. > > Thanks for the summary of different types of integers on different > platforms Keith. When I wrote above I had simply done a quick Google > search and found > https://www.tutorialspoint.com/what-is-long-long-in-c-cplusplus where > it said "On Linux environment the long takes 64-bit (8-bytes) of > space, and the long long takes 128-bits (16-bytes) of space." I have > never seen 128-bit integers either but have seen on the development > log on AdaCore's website that support for 128-bit integers have been > added to the Interfaces package (Interfaces.Integer_128 and > Interfaces.Unsigned_128). I believe they are part of the new Ada2022 > standard. That web page is simply wrong about long long being 128 bits. It certainly can be (the C standard only says that it's at least 64 bits), but it's exactly 64 bit on every implementation I've seen or heard of. I'm not shocked that something on tutorialspoint.com is wrong. There are several common data models in the C and C++ world: Name ILP32 LP64 IL32P64 ==== ===== ==== ======= char 8 8 8 short 16 16 16 int 32 32 32 long 32 64 32 long long 64 64 64 pointer 32 64 64 32-bit systems (which are becoming rarer for non-embedded systems) typically use ILP32, and 64-bit Linux/Unix systems typically use LP64. 64-bit Windows uses IL32P64 (and hardly anything else does). It's *seems* almost obvious that Ada's types Character Short_Integer Integer Long_Integer Long_Long_Integer should correspond to the similarly named C types, but it's not required. (I don't know whether GNAT does so consistently or not.) Some C and C++ compilers support 128-bit integers on 64-bit systems. gcc supports "__int128" and "unsigned __int128", but they don't quite meet all the C requirements for integer types; for example, there are no literals of those types. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com Working, but not speaking, for Philips void Void(void) { Void(); } /* The recursive call of the void */