Existe-t-il des implémentations C existantes ayant un bit de remplissage dans la représentation entière signée?

Selon C99, il peut y avoir des bits de remplissage dans la représentation avec ou unsigned int signed int . Je me demande donc s’il existe encore des implémentations ayant de telles choses obsolètes?

Citant la justification du C99 ( PDF ) section 6.2.6.2 §20:

Les bits de remplissage sont accessibles à l’utilisateur dans un type entier non signé. Par exemple, supposons qu’une machine utilise une paire de courts-circuits de 16 bits (chacun avec son propre bit de signe) pour constituer un int 32 bits et que le bit de signe du plus short est ignoré lorsqu’il est utilisé dans cet int 32 bits. Ensuite, en tant qu’int signed int 32 bits, il existe un bit de remplissage (au milieu des 32 bits) qui est ignoré lors de la détermination de la valeur 20 de l’entier signed int 32 bits. Toutefois, si cet élément 32 bits est traité comme un unsigned int 32 bits, alors ce bit de remplissage est visible par le programme de l’utilisateur. On a dit au comité C qu’il existe une machine qui fonctionne de cette façon, et c’est l’une des raisons pour lesquelles des bits de remplissage ont été ajoutés à C99.

Donc, au moins, de telles choses existaient.

En ce qui concerne les architectures étranges qui existent encore de nos jours , l’exemple le plus intéressant est la série UNIVAC 1100/2200 avec ses formats de données étranges .

Bien qu’il n’utilise pas de remplissage d’entiers, un coup d’œil au manuel de leur compilateur C ( PDF ) est toujours instructif:

 Table 4–4. Size and Range of Unsigned Integer Types Type Size Range unsigned short int 18 bits 0 to (2^18)–1 unsigned short unsigned int 36 bits 0 to (2^36)–2 (see the following note) unsigned unsigned long int 36 bits 0 to (2^36)–2 (see the following note) unsigned long 

Le deuxième volume ( PDF ) explique comment le mot clé du compilateur CONFORMANCE/TWOSARITH peut être utilisé pour contrôler l’interprétation du zéro négatif: il ajuste la plage des types entiers non signés sur celle attendue (2 ^ 36) -1, mais entraîne une pénalité de performance arithmétique non signée.

De la nouvelle norme C :

Sur certains processeurs Cray, le type short a une précision de 32 bits mais est conservé dans une mémoire de 64 bits. Le type entier non signé Unisys A Series contient un bit de remplissage traité comme un bit de signe dans la représentation de nombre entier signé.

L’ordinateur Harris / 6 représentait le type long en utilisant deux types int consécutifs. Cela signifiait que le bit de signe de l’un des composants devait être ignoré; il a été traité comme un bit de remplissage. La représentation de la valeur de type int a une largeur de 24 bits et a longtemps une valeur de 47 bits avec un bit de remplissage.

L’architecture MSP430X (une architecture pour microcontrôleurs de Texas Instruments) est une architecture 16 bits (MSP430) étendue à un espace d’adressage de 20 bits avec des registres de 20 bits. L’architecture est toujours adressée octet avec un octet ayant huit bits. Les instructions peuvent généralement fonctionner avec des quantités de 8, 16 et 20 bits.

Sur cette architecture, un compilateur peut choisir de faire un type int 20 bits. Puisque 20 n’est pas un multiple de 8, 4 ou 12 bits de remplissage doivent être ajoutés lors du stockage de ce type en mémoire.