12
votes

La taille entière en C dépend de quoi?

La taille de l'entier dépend de quoi?

est la taille d'une variable int en c dépendante de la machine ou du compilateur?

c

3 commentaires

Je pense que le terme correct est la "mise en œuvre dépendante".


Est-il dépendant du processeur comme 16 bits ou 32 bits?


duplicaté exact: Stackoverflow.com/Questtions/2331751/...


8 Réponses :


2
votes

Comme dit de MAK, il est dépendant de la mise en œuvre. Cela signifie que cela dépend du compilateur. En règle générale, un compilateur cible une seule machine afin que vous puissiez également y penser comme dépendant de la machine.


2 commentaires

Cela signifie que la conception du compilateur est en fonction de la machine ??


Parfois. Certains compilateurs (tels que GCC) sont des plateformes croisées et peuvent cibler plusieurs machines. Certains compilateurs ne cible qu'une seule machine (ceci est particulièrement vrai pour les compilateurs qui cible des processeurs embarqués). Si je me souviens bien, les règles de la taille des types de données vont tout comme ceci: Tailleof (Char) == 1; Tailleof (char) <= Tailleof (court) <= Tailleof (int) <= Taille de (Long)



0
votes

Cela dépend de l'architecture (machine, type exécutable) et au compilateur. C et C ++ garantissent certains minimums. (Je pense que ce sont des trousses: 8 bits, int: 16 bits, long: 32 bits)

C99 inclut certaines types de largeur connues telles que uint32_t (si possible). Voir stdint.h

Mise à jour : Les préoccupations de Conrad Meyer ont adressé.


4 commentaires

Il ne prévoit que les types de largeur fixe si le matériel les soutient raisonnablement.


@Conrad Meyer, voulez-vous dire uint32_t ne sera pas 32 bits sur certaines machines ou que uint32_t ne sera pas disponible sur certaines machines? Je voulais seulement dire que le premier n'arrivera pas, mais les corrections sont les bienvenues.


uint32_t doit être 32 bits si le matériel prend en charge les entiers 32 bits et non définis du tout si cela ne le fait pas. Si vous devez prendre en charge des systèmes non-16/30 / 64 bits, utilisez les types uint_leastn_t à la place.


C'est bien ce que je voulais dire. Merci pour la confirmation et de le dire clairement.



2
votes

AFAIK, la taille des types de données est la mise en œuvre dépendante . Cela signifie qu'il est entièrement à la mise en œuvre (c'est-à-dire le gars qui écrit le compilateur) de choisir ce que ce sera.

Donc, en bref, cela dépend du compilateur. Mais souvent, il est plus simple de simplement utiliser la taille qu'il est plus facile de mapper sur la taille de mot de la machine sous-jacente - de sorte que le compilateur utilise souvent la taille qui correspond au mieux à la machine sous-jacente.


3 commentaires

Mais si nous utilisons un compilateur 16 bits comme C compilateur C, il faut 16 bits et si nous utilisons VC ++ sur la même machine, il prend 32 bits, puis comment il peut utiliser la taille de la machine sous-jacente ??


@shubhangi Motling: la machine sous-jacente prend normalement des types d'entier de 16 bits ainsi que des types d'entier 32 bits. Donc, il n'y a pas de problème ici du tout.


@shubhangi Voir la deuxième phrase de la réponse, ainsi que le mot "souvent", répété deux fois.



7
votes

Cela dépend principalement du compilateur. Par exemple, si vous avez un processeur X86 de 64 bits, vous pouvez utiliser un ancien compilateur 16 bits et obtenir des INT de 16 bits, un compilateur 32 bits et obtenir des INT 32 bits, ou un compilateur 64 bits et obtenir 64 -Bit Ints.

Cela dépend du processeur dans le degré que le compilateur cible un processeur particulier, et (par exemple) un ancien processeur 16 bits n'exécutera tout simplement pas de code qui cible un nouveau processeur 64 bits brillants.

Les normes C et C ++ garantissent une taille minimale (indirectement en spécifiant des gammes de prise en charge minimum): xxx

garantie également que les tailles / gammes sont strictement non diminuant dans l'ordre suivant: char, court, int, long et long long 1 .

1 long long est spécifié en C99 et C ++ 0x, mais certains compilateurs (par exemple, GCC, Intel, Comeau) le permettent également de C ++ 03. Si vous voulez, vous pouvez convaincre la plupart (sinon tout) de rejeter long long dans C ++ 03 code.


0 commentaires

0
votes

Cela dépend de l'environnement de course, quel que soit le matériel que vous avez. Si vous utilisez un système d'exploitation de 16 bits comme DOS, il y aura 2 octets. Sur un système d'exploitation 32 bits comme Windows ou Unix, il s'agit de 4 octets et ainsi de suite. Même si vous exécutez un système d'exploitation 32 bits sur un processeur 64 bits, la taille sera de 4 octets seulement. J'espère que cela vous aidera.


1 commentaires

Cela aiderait plus si c'était précis. Bien que les paramètres par défaut du compilateur correspondent généralement à l'environnement de fonctionnement, la compilation croisée est possible.



8
votes

Formalement, les représentations de tous les types de données fondamentaux (y compris leurs tailles) dépendent du compilateur et uniquement dépendant du compilateur. Le compilateur (ou, plus correctement, la mise en oeuvre ) peut servir de couche d'abstraction entre le programme et la machine, cacher complètement la machine du programme ou la déformer de quelque manière que ce soit.

Mais dans la pratique Les compilateurs sont conçus pour générer le code le plus efficace pour la machine donnée et / ou le système d'exploitation. Afin de réaliser que les types de données fondamentaux devraient avoir une représentation naturelle pour la machine et / ou le système d'exploitation donné. En ce sens, ces représentations dépendent indirectement de la machine et / ou du système d'exploitation.

En d'autres termes, du point de vue de résumé, formel et pédant, le compilateur est libre d'ignorer complètement les représentations de type de données spécifiques à la machine. Mais cela ne fait aucun sens pratique. En pratique, les compilateurs utilisent pleinement les représentations de type de données fournies par la machine.

Néanmoins, si un type de données n'est pas pris en charge par la machine, le compilateur peut toujours fournir ce type de données aux programmes en mettant en œuvre son support au niveau du compilateur («émulation»). Par exemple, les types d'entiers 64 bits sont normalement disponibles dans des compilateurs 32 bits pour des machines 32 bits, même si elles ne sont pas directement prises en charge par la machine. De retour dans la journée, les compilateurs fourniraient souvent une prise en charge au niveau du compilateur des types de points flottants pour les machines qui n'étaient pas équipées de co-processeur à virgule flottante (et ne prennent donc pas en charge les types de points flottants directement).


2 commentaires

C'est une bonne réponse que la mienne.


Cela rend un sens pratique pour la compilation croisée. Ajoutez cela et cette réponse est proche de la perfection. En fait, vous pouvez simplement clarifier que "la machine" fait référence à la machine cible .



12
votes

Il est dépendant de la mise en œuvre. La norme C ne nécessite que:

  • char a au moins 8 bits
  • court a au moins 16 bits
  • int a au moins 16 bits
  • long a au moins 32 bits
  • long long a au moins 64 bits (ajouté en 1999)
  • Tailleof (Char) ≤ Taille de taille (courte) ≤ Tailleof (int) ≤ Taille de (Long) ≤ Tailleof (Long Long)

    Dans les jours 16/22 bits, la norme de facto était:

    • int était la taille entière "natif"
    • Les autres types étaient la taille minimale autorisée

      Cependant, les systèmes 64 bits ont généralement pas marques int 64 bits, ce qui aurait créé la situation inconfortable d'avoir trois types de 64 bits et aucun 32 bits taper. certains compilateurs développés long à 64 bits.


1 commentaires

<< Situation gênante d'avoir trois types de 64 bits et aucun type 32 bits. Ici, vous vouliez dire si INT est effectué 64 bits, puis les 3 types de données (INT, long, long long) devient 64 bits. Pour éviter cela, INT est intentionnellement fait comme 32 bits. Aussi, avec 64 bits en place, cette déclaration ne tient plus bonne "int était la" taille entier natif ".



0
votes

La taille d'une variable entière dépend du type de compilateur:

  • Si vous avez un compilateur 16 bits: XXX

  • Si vous avez un compilateur 32 bits:

    La taille de chaque variable est juste du double de sa taille dans un compilateur 16 bits XXX

    Même chose se produit si vous avez un compilateur 64 bits, et ainsi de suite.


0 commentaires