2010-10-12 4 views
2

Existe-t-il un moyen d'implémenter un entier non signé de 33 bits pour le compilateur gcc? A partir de maintenant, j'utilise des entiers 64 bits non signés pour stocker une valeur de 33 bits. Mais malheureusement, je veux que la valeur soit réinitialisée après avoir atteint 33 bits ...comment implémenter le type entier non signé 33 bits

+10

Je me demande pourquoi vous en auriez même besoin ... –

Répondre

2
struct int33 
{ 
    unsigned long long x:33; 
}; 

?

13

Vous pouvez utiliser un champ de bits, par ex. (result)

#include <stdint.h> 
#include <cstdio> 

struct uint33_t { 
    uint64_t value : 33; 
}; 

int main() { 
    uint33_t x = {0x1FFFFFFFFull}; 

    printf("%llx\n", x.value); 

    x.value += 1; 

    printf("%llx\n", x.value); 


     return 0; 
} 
+1

Les champs binaires de types de données que 'int',' signed int' et 'unsigned int' sont des extensions spécifiques au compilateur, mais GCC le supporte donc de toute façon +1 :-) – Christoffer

+2

@Christoffer: Ce n'est pas une extension. La norme C++ permet d'utiliser n'importe quel type d'intégrale ou d'énumération (§ [class.bit]/3) comme type de champ de bits. – kennytm

+0

Merci beaucoup .. ça aide. J'adore Stackoverflow – neuron

2

La valeur va déborder lorsqu'il est poussé au-delà de la limite de 33 bits; Si vous utilisez un masque de 33 bits lorsque vous récupérez la valeur, vous devriez obtenir le comportement souhaité.

+4

Traduit: Utiliser le type de données 64 bits natif, et seulement utiliser 33 bits de celui-ci lors de la lecture. –

+0

@Billy: merci pour la reformulation. – fbrereto

Questions connexes