Cours 4 : Processeurs, Représentation des entiers/flottants
Jeu d’instruction Intel x86
Pourquoi x86 ?
- Avant : 8088 : registres de 8 bits, adressage de 16 bits
- Puis : 8086 : mélange de 8 et 16 bits
- Puis : 80286 : rajout d’un hôte protégé (administrateur), et 802386, 80234586, …
À chaque étape : rétro-compatibilité (⟹ complique largement le format binaire).
- AL/AH : L=low, H=high
#include <stdio.h>
int main()
{
printf("char : %ld octets", sizeof(long int))
}
NB :
- signed :
0xff = 0xfffff...
- unsigned :
0xff = 0x0....0ff
NB : mêmes opérations pour signed et unsigned (x+(-x)=0 est vrai), donc l’interprétation “signed/unsigned” est purement humaine : l’ordi les manipule avec les mêmes opérations.
a = 010111
{.C}
Décalage logique (on complète par des 0
):
a>>1
{.C} (a ⟵ 0
a)
a<<1
{.C} (a ⟵ a0
)
VS :
- décalage arithmétique : on garde le signe :
a>>1
{.C} (a ⟵1
a) si a négatifa>>1
{.C} (a ⟵0
a) si a positif
cf. https://www.h-schmidt.net/FloatConverter/IEEE754.html
Pour la finance : on n’utilise pas des floats, mais des entiers et on ajuste l’affichage (plus sûr que pour les floats : erreurs d’arrondis)
2.5 = 1.25.2^1 = 0 1000000 010...
(bit de signe + “exposant + 127” + “partie décimale -1” )
0.75 = 1.5.2^-1 = 1 0111110 10000...
NB :
- addition des mantisses : on garde le plus grand exposant (ici : on divise par 4 la mantisse faible, pour augmenter son exposant de deux).
m_x = 1 0100... m_y = 1 1000... ⇓ m_x = 1 0100... m_y = 0 011000... _______________ m_z = 1 1010....
Mais
- si il n’y a pas de plus grand exposant : on répercute ça sur l’exposant.
- si exposant(m_x)»exposant(m_y), de telle sorte qu’on décale m_y de plus de 23 bits : alors $m_x+m_y ≃m_x$ : $m_x$ reste inchangée.
wchar
= UTF-32
-
mbstowcs
: multi-byte string to wide character stringMAIS : il faut d’abord mettre le bon
locale
(dans vim :set_locale
)Convertir autre codage vers
wchar
: d’abord utilisersetlocale
-
wcstombs
: fait l’inverse -
iconv
: plus souple, mais plus compliqué à utiliser -
wcslen
: compter le nb de caractère -
wprintf
: commeprintf
, mais en entrée, le modèle doit être donné comme unwchar
- ex:
"%s"
:printf
va attendre un argument de typechar
"%ls"
:wchar
- ex:
Leave a comment