Les non-signés, la norme garanti [0, 2^n - 1].
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Les non-signés, la norme garanti [0, 2^n - 1].
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Les non-signés, la norme garanti [0, 2^n - 1].
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Les non-signés, la norme garanti [0, 2^n - 1].
Pas si tu insistes que n soit le nombre de bits. Il peut y avoir
des bits de padding, et autant que je sache, une implémentation
sur un hardware qui ne supporte pas de non-signer (les anciens
Unisys séries A ?) peut le simuler en masquant le bit de signe.
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Non. On a même des implémentations actuelles où ce n'est pas le
cas. Comment en ferais-tu si le hardware est complément à 1 (le
cas des Unisys 2200 actuels). Ou magnitude signée (le cas des
anciens Unisys séries A).
Aussi, la norme permet à ce que certaines valeurs
« trappent ». La norme C est beaucoup plus précise à cet
égard, et dit explicitement que si la représentation est
complément à 2 ou magnitude signée, une représentation avec le
bit de signe à 1 et tous les autres bits à zéro peut trapper.
Dans la pratique, évidemment, au moins de rencontrer un Unisys
2200, ou de se rétrouver sur des architectures fortes anciennes
(mais alors, il n'y a probablement pas de compilateur C++), les
entiers signés sont complément à 2, et tu auras l'intervale
auquel tu t'attends.
Les non-signés, la norme garanti [0, 2^n - 1].
Pas si tu insistes que n soit le nombre de bits. Il peut y avoir
des bits de padding, et autant que je sache, une implémentation
sur un hardware qui ne supporte pas de non-signer (les anciens
Unisys séries A ?) peut le simuler en masquant le bit de signe.
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Non. On a même des implémentations actuelles où ce n'est pas le
cas. Comment en ferais-tu si le hardware est complément à 1 (le
cas des Unisys 2200 actuels). Ou magnitude signée (le cas des
anciens Unisys séries A).
Aussi, la norme permet à ce que certaines valeurs
« trappent ». La norme C est beaucoup plus précise à cet
égard, et dit explicitement que si la représentation est
complément à 2 ou magnitude signée, une représentation avec le
bit de signe à 1 et tous les autres bits à zéro peut trapper.
Dans la pratique, évidemment, au moins de rencontrer un Unisys
2200, ou de se rétrouver sur des architectures fortes anciennes
(mais alors, il n'y a probablement pas de compilateur C++), les
entiers signés sont complément à 2, et tu auras l'intervale
auquel tu t'attends.
Les non-signés, la norme garanti [0, 2^n - 1].
Pas si tu insistes que n soit le nombre de bits. Il peut y avoir
des bits de padding, et autant que je sache, une implémentation
sur un hardware qui ne supporte pas de non-signer (les anciens
Unisys séries A ?) peut le simuler en masquant le bit de signe.
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Non. On a même des implémentations actuelles où ce n'est pas le
cas. Comment en ferais-tu si le hardware est complément à 1 (le
cas des Unisys 2200 actuels). Ou magnitude signée (le cas des
anciens Unisys séries A).
Aussi, la norme permet à ce que certaines valeurs
« trappent ». La norme C est beaucoup plus précise à cet
égard, et dit explicitement que si la représentation est
complément à 2 ou magnitude signée, une représentation avec le
bit de signe à 1 et tous les autres bits à zéro peut trapper.
Dans la pratique, évidemment, au moins de rencontrer un Unisys
2200, ou de se rétrouver sur des architectures fortes anciennes
(mais alors, il n'y a probablement pas de compilateur C++), les
entiers signés sont complément à 2, et tu auras l'intervale
auquel tu t'attends.
Les non-signés, la norme garanti [0, 2^n - 1].
Pas si tu insistes que n soit le nombre de bits. Il peut y
avoir des bits de padding, et autant que je sache, une
implémentation sur un hardware qui ne supporte pas de
non-signer (les anciens Unisys séries A ?) peut le simuler
en masquant le bit de signe.
Donc 2^(sizeof(unsigned)*CHAR_BIT) - 1 peut être supérieur à
UINT_MAX.
Mais quand la norme spécifie que unsigned int fait
au moins 16 bits, parle-t-elle de sizeof ou de UINT_MAX ?
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Non. On a même des implémentations actuelles où ce n'est pas
le cas. Comment en ferais-tu si le hardware est complément à
1 (le cas des Unisys 2200 actuels). Ou magnitude signée (le
cas des anciens Unisys séries A).
Aussi, la norme permet à ce que certaines valeurs « trappent
». La norme C est beaucoup plus précise à cet égard, et dit
explicitement que si la représentation est complément à 2 ou
magnitude signée, une représentation avec le bit de signe à
1 et tous les autres bits à zéro peut trapper.
Dans la pratique, évidemment, au moins de rencontrer un
Unisys 2200, ou de se rétrouver sur des architectures fortes
anciennes (mais alors, il n'y a probablement pas de
compilateur C++), les entiers signés sont complément à 2, et
tu auras l'intervale auquel tu t'attends.
Hmm, je vais me limiter aux architectures courantes, alors.
C'est pour l'écriture d'un flux binaire :
void
BinaryStream::writeUInt8(unsigned x)
{
assert(x <= 0xFF);
myIsOk = myIsOk && myBuffer->sputc(x)
!= std::streambuf::traits_type::eof();
}
void
BinaryStream::writeUInt16(unsigned x)
{
assert(x <= 0xFFFFU);
writeUInt8((x ) & 0xFF);
writeUInt8((x >> 8) & 0xFF);
}
void
BinaryStream::writeInt8(int x)
{
assert(-0x80 <= x && x <= 0x7F);
writeUInt8(x < 0 ? 0xFF + (x + 1) : x);
}
void
BinaryStream::writeInt16(int x)
{
assert(-0x8000 <= x && x <= 0x7FFF);
writeUInt16(x < 0 ? 0xFFFFU + (x + 1) : x);
}
Les non-signés, la norme garanti [0, 2^n - 1].
Pas si tu insistes que n soit le nombre de bits. Il peut y
avoir des bits de padding, et autant que je sache, une
implémentation sur un hardware qui ne supporte pas de
non-signer (les anciens Unisys séries A ?) peut le simuler
en masquant le bit de signe.
Donc 2^(sizeof(unsigned)*CHAR_BIT) - 1 peut être supérieur à
UINT_MAX.
Mais quand la norme spécifie que unsigned int fait
au moins 16 bits, parle-t-elle de sizeof ou de UINT_MAX ?
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Non. On a même des implémentations actuelles où ce n'est pas
le cas. Comment en ferais-tu si le hardware est complément à
1 (le cas des Unisys 2200 actuels). Ou magnitude signée (le
cas des anciens Unisys séries A).
Aussi, la norme permet à ce que certaines valeurs « trappent
». La norme C est beaucoup plus précise à cet égard, et dit
explicitement que si la représentation est complément à 2 ou
magnitude signée, une représentation avec le bit de signe à
1 et tous les autres bits à zéro peut trapper.
Dans la pratique, évidemment, au moins de rencontrer un
Unisys 2200, ou de se rétrouver sur des architectures fortes
anciennes (mais alors, il n'y a probablement pas de
compilateur C++), les entiers signés sont complément à 2, et
tu auras l'intervale auquel tu t'attends.
Hmm, je vais me limiter aux architectures courantes, alors.
C'est pour l'écriture d'un flux binaire :
void
BinaryStream::writeUInt8(unsigned x)
{
assert(x <= 0xFF);
myIsOk = myIsOk && myBuffer->sputc(x)
!= std::streambuf::traits_type::eof();
}
void
BinaryStream::writeUInt16(unsigned x)
{
assert(x <= 0xFFFFU);
writeUInt8((x ) & 0xFF);
writeUInt8((x >> 8) & 0xFF);
}
void
BinaryStream::writeInt8(int x)
{
assert(-0x80 <= x && x <= 0x7F);
writeUInt8(x < 0 ? 0xFF + (x + 1) : x);
}
void
BinaryStream::writeInt16(int x)
{
assert(-0x8000 <= x && x <= 0x7FFF);
writeUInt16(x < 0 ? 0xFFFFU + (x + 1) : x);
}
Les non-signés, la norme garanti [0, 2^n - 1].
Pas si tu insistes que n soit le nombre de bits. Il peut y
avoir des bits de padding, et autant que je sache, une
implémentation sur un hardware qui ne supporte pas de
non-signer (les anciens Unisys séries A ?) peut le simuler
en masquant le bit de signe.
Donc 2^(sizeof(unsigned)*CHAR_BIT) - 1 peut être supérieur à
UINT_MAX.
Mais quand la norme spécifie que unsigned int fait
au moins 16 bits, parle-t-elle de sizeof ou de UINT_MAX ?
Qu'en est-il des signés,
a-t-on [-2^(n - 1), 2^(n - 1) - 1] de garanti ?
Non. On a même des implémentations actuelles où ce n'est pas
le cas. Comment en ferais-tu si le hardware est complément à
1 (le cas des Unisys 2200 actuels). Ou magnitude signée (le
cas des anciens Unisys séries A).
Aussi, la norme permet à ce que certaines valeurs « trappent
». La norme C est beaucoup plus précise à cet égard, et dit
explicitement que si la représentation est complément à 2 ou
magnitude signée, une représentation avec le bit de signe à
1 et tous les autres bits à zéro peut trapper.
Dans la pratique, évidemment, au moins de rencontrer un
Unisys 2200, ou de se rétrouver sur des architectures fortes
anciennes (mais alors, il n'y a probablement pas de
compilateur C++), les entiers signés sont complément à 2, et
tu auras l'intervale auquel tu t'attends.
Hmm, je vais me limiter aux architectures courantes, alors.
C'est pour l'écriture d'un flux binaire :
void
BinaryStream::writeUInt8(unsigned x)
{
assert(x <= 0xFF);
myIsOk = myIsOk && myBuffer->sputc(x)
!= std::streambuf::traits_type::eof();
}
void
BinaryStream::writeUInt16(unsigned x)
{
assert(x <= 0xFFFFU);
writeUInt8((x ) & 0xFF);
writeUInt8((x >> 8) & 0xFF);
}
void
BinaryStream::writeInt8(int x)
{
assert(-0x80 <= x && x <= 0x7F);
writeUInt8(x < 0 ? 0xFF + (x + 1) : x);
}
void
BinaryStream::writeInt16(int x)
{
assert(-0x8000 <= x && x <= 0x7FFF);
writeUInt16(x < 0 ? 0xFFFFU + (x + 1) : x);
}
[...]
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ;
la seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit,
0x8000 a le type unsigned. Ce qui fait que ton x sera converti
en unsigned avant la comparaison.)
[...]
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ;
la seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit,
0x8000 a le type unsigned. Ce qui fait que ton x sera converti
en unsigned avant la comparaison.)
[...]
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ;
la seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit,
0x8000 a le type unsigned. Ce qui fait que ton x sera converti
en unsigned avant la comparaison.)
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ;
la seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit,
0x8000 a le type unsigned. Ce qui fait que ton x sera converti
en unsigned avant la comparaison.)
J'ai eu un problème similaire avec -2147483648 sur une machine 32 bits.
Si je me rappelle bien, j'ai dû le remplacer par (-2147483647 - 1) pour
éviter un warning à la compilation.
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ;
la seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit,
0x8000 a le type unsigned. Ce qui fait que ton x sera converti
en unsigned avant la comparaison.)
J'ai eu un problème similaire avec -2147483648 sur une machine 32 bits.
Si je me rappelle bien, j'ai dû le remplacer par (-2147483647 - 1) pour
éviter un warning à la compilation.
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ;
la seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit,
0x8000 a le type unsigned. Ce qui fait que ton x sera converti
en unsigned avant la comparaison.)
J'ai eu un problème similaire avec -2147483648 sur une machine 32 bits.
Si je me rappelle bien, j'ai dû le remplacer par (-2147483647 - 1) pour
éviter un warning à la compilation.
C'est bizarre, je pensais que -0x8000 et -2147483648 étaient des
constantes entières signées (négatives),
alors que si je comprend
bien c'est des constantes entières non signées positives (0x8000
et 2147483648) auxquelles on applique l'opérateur - ?
C'est bizarre, je pensais que -0x8000 et -2147483648 étaient des
constantes entières signées (négatives),
alors que si je comprend
bien c'est des constantes entières non signées positives (0x8000
et 2147483648) auxquelles on applique l'opérateur - ?
C'est bizarre, je pensais que -0x8000 et -2147483648 étaient des
constantes entières signées (négatives),
alors que si je comprend
bien c'est des constantes entières non signées positives (0x8000
et 2147483648) auxquelles on applique l'opérateur - ?
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ; la
seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit, 0x8000 a
le type unsigned. Ce qui fait que ton x sera converti en unsigned
avant la comparaison.)
J'ai eu un problème similaire avec -2147483648 sur une machine 32
bits. Si je me rappelle bien, j'ai dû le remplacer par (-2147483647
- 1) pour éviter un warning à la compilation.
C'est bizarre, je pensais que -0x8000 et -2147483648 étaient des
constantes entières signées (négatives), alors que si je comprend bien
c'est des constantes entières non signées positives (0x8000 et
2147483648) auxquelles on applique l'opérateur - ?
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ; la
seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit, 0x8000 a
le type unsigned. Ce qui fait que ton x sera converti en unsigned
avant la comparaison.)
J'ai eu un problème similaire avec -2147483648 sur une machine 32
bits. Si je me rappelle bien, j'ai dû le remplacer par (-2147483647
- 1) pour éviter un warning à la compilation.
C'est bizarre, je pensais que -0x8000 et -2147483648 étaient des
constantes entières signées (négatives), alors que si je comprend bien
c'est des constantes entières non signées positives (0x8000 et
2147483648) auxquelles on applique l'opérateur - ?
assert(-0x8000 <= x && x <= 0x7FFF);
Note bien que ce que tu as écrit là est prèsque 100% portable ; la
seule chose qui n'est pas garantie par la norme, c'est la
comparaison d'un int avec -0x8000. (Sur une machine 16 bit, 0x8000 a
le type unsigned. Ce qui fait que ton x sera converti en unsigned
avant la comparaison.)
J'ai eu un problème similaire avec -2147483648 sur une machine 32
bits. Si je me rappelle bien, j'ai dû le remplacer par (-2147483647
- 1) pour éviter un warning à la compilation.
C'est bizarre, je pensais que -0x8000 et -2147483648 étaient des
constantes entières signées (négatives), alors que si je comprend bien
c'est des constantes entières non signées positives (0x8000 et
2147483648) auxquelles on applique l'opérateur - ?