lange dubbele vs dubbele

Ik weet dat de grootte van verschillende gegevenstypen kan veranderen, afhankelijk van het systeem waarop ik werk.

Ik gebruik XP 32-bits en als ik de operator sizeof()in C++ gebruik, lijkt het alsof long double12 bytes is en doubleis 8.

De meeste grote bronnen stellen echter dat long double8 bytes is, en het bereik is daarom hetzelfde als een double.

Hoe komt het dat ik 12 bytes heb? Als long doubleinderdaad 12 bytes is, vergroot dit dan niet ook het waardebereik? Of wordt de lange handtekening alleen gebruikt (de compilercijfers) wanneer de waarde het bereik van een double overschrijdt, en dus groter is dan 8 bytes?


Antwoord 1, autoriteit 100%

Citaat uit Wikipedia:

Op de x86-architectuur implementeren de meeste compilers long double als het 80-bits uitgebreide precisietype dat door die hardware wordt ondersteund (soms opgeslagen als 12 of 16 bytes om de gegevensstructuur te behouden.

en

Compilers kunnen ook long double gebruiken voor een 128-bits viervoudige precisie-indeling, die momenteel in software is geïmplementeerd.

Met andere woorden, ja, een long doublekaneen groter bereik aan waarden kunnen opslaan dan een double. Maar het is volledig aan de compiler.


Antwoord 2, autoriteit 21%

Voor moderne compilers op x64, gebruiken Clang en GCC 16-byte double voor long doubleterwijl VC++ 8-byte double gebruikt. Met andere woorden, met Clang en GCC krijg je dubbel met een hogere precisie, maar voor VC++ is long doublehetzelfde als double. De moderne x86-CPU’s ondersteunen deze 16-byte-doubles, dus ik denk dat Clang en GCC het juiste doen en je toegang geven tot hardware op een lager niveau met behulp van taalprimitieven op een hoger niveau.


Antwoord 3, autoriteit 5%

De standaard bytegroottes voor getallen zijn de gegarandeerde minimumgroottes voor alle platforms. Op sommige systemen kunnen ze groter zijn, maar kleiner zullen ze nooit zijn.

Other episodes