8
votes

C: long long toujours 64 bits?

Si j'utilise de longues longs dans mon code, puis-je garantir à 100% de manière absolue qu'ils auront 64 bits, quelle que soit la machine sur laquelle le code est exécuté?

c

1 commentaires

4 Réponses :


15
votes

Non, la norme C99 dit qu'il aura au moins 64 bits. Donc, cela pourrait être plus que cela à un moment donné, je suppose. Vous pouvez utiliser intz_t si vous avez besoin de 64bits toujours en supposant que vous avez stdint.h disponible (standard en C99). XXX


3 commentaires

intz_t doit être fourni si la mise en œuvre a un type qui correspond à ses exigences - mais il est (au moins théoriquement) possible qu'aucun type de ce type n'existe, auquel cas intz_t gagné ' t être défini.


int_least64_t doit être fourni par C99 implémentations ; Cela garantit 64 bits ou plus


@PMG Long Long Garantie également au moins 64 bits. C'était le problème. :-)



0
votes

Ils sont garantis comme un minimum de 64 bits. Il est théoriquement possible qu'ils puissent être plus grands (par exemple, 128 bits), bien que je ne suis raisonnablement que 64 bits sur quoi que ce soit actuellement disponible.


5 commentaires

Sur les compilateurs de modèles de mémoire LLP64, il aurait été pratique si longtemps longtemps int a été heurté jusqu'à 128 bits.


Je serais surpris si aucun DSP avec une non-puissance de mot de deux formes n'est disponible et DSP a généralement un compilateur C. Et ensuite les machines historiques sont un peu plus vivantes que souvent que: PDP-10 (36 processeurs BITS, il a un port de GCC quelque part sur le net et je pense qu'il a utilisé 72 bits longs longs) était toujours utilisé comme intégré Processeur dans certains matériels de réseau La dernière fois que j'ai examiné, et Unisys vend toujours 36 bits et 48 bits de machines - je ne sais pas s'ils ont des compilateurs C pour eux ou non.


@Aprogrammer: Je crois que Unisys a un compilateur C, mais au moins la dernière fois que j'ai regardé, il n'a tenté que de se conformer à C90 plutôt que de C99, donc je ne suis pas du tout sûr qu'il avait du tout longtemps long. Je suppose que mon libellé était ambigu: tandis que GCC est certainement disponible, les PDP-10 n'ont pas été depuis un certain temps.


@Jerry, si je n'étais pas clair, les cas pratiques que je me soucierais d'être DSP, et non de PDP-10 (XKL les a toujours vendus en 1997 et je pense qu'ils les utilisent toujours en interne) ni les machines Unisys.


@Aprogrammer: Je suis moins sûr des DSP. Ad sigmadsp, par exemple, sont des processeurs 28/56 bits, de sorte que le choix évident pour eux serait de 112 bits pour long long , mais au moins la dernière fois que je les ai utilisés, ils n'ont pas fourni cette. TigersHarc utilise des longs longs de 64 bits. Je crois que Ti C5000 et C6000 utilisent aussi longtemps 64 bits. Il y a d'autres vendeurs, mais ...



0
votes

avec xxx

ou un peu équivalent.

basé sur le commentaire: Si vous souhaitez prendre en charge les compilateurs où Tailleof ne peut pas être utilisé dans le pré-processeur, voir Ce fil:

http://www.daniweb.com/forums/thread13553 .html

quelque chose comme ceci: xxx


4 commentaires

Vous ne pouvez pas utiliser sizeof dans une expression de préprocesseur (officiellement de toute façon - certains compilateurs le permettent, mais c'est une extension).


Pour ces compilateurs, il y a un truc avec une matrice avec la taille qui est illégale s'il ne correspond pas. Va trouver et poster.


Les astuces avec Tailleof ne sont malheureusement pas garanties de travailler sur des machines bizarres avec des bits de rembourrage. Voir ma réponse pour les variantes qui ne comptent pas sur cela.


Umm, #if llong_min! = -0x7fffffffffffffffff-1 est le moyen simple et simple (cela vérifie également les twos complément en même temps, que vous voudrez presque sûrement vous assurer que vous vous souciez de vous en tenir compte. nombre de bits).



2
votes

Vous pouvez tester si votre compilateur est C99 conformément aux numéros dans le préprocesseur avec ce document

unsigned long long has_ullong_max[-1 + 2*((0ULL - 1) >= 18446744073709551615ULL)];


0 commentaires