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 ⟵ 0a)

a<<1{.C} (a ⟵ a0)

VS :

  • décalage arithmétique : on garde le signe :
    • a>>1{.C} (a ⟵ 1a) si a négatif
    • a>>1{.C} (a ⟵ 0a) 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 string

    MAIS : il faut d’abord mettre le bon locale (dans vim : set_locale)

    Convertir autre codage vers wchar : d’abord utiliser setlocale

  • wcstombs : fait l’inverse

  • iconv : plus souple, mais plus compliqué à utiliser

  • wcslen : compter le nb de caractère

  • wprintf : comme printf, mais en entrée, le modèle doit être donné comme un wchar

    • ex: "%s" : printf va attendre un argument de type char
    • "%ls" : wchar

Leave a comment