FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Calculatrice
par papydall Hier à 22:54

» EPP_V01 éditeur pour Panoramic
par Minibug Mer 19 Sep 2018 - 21:03

» [RESOLU] Quelle ligne est sélectionnée dans SYNEDIT ?
par Jean Claude Mer 19 Sep 2018 - 21:02

» PanExpress : l'éditeur Panoramic avec création d'objet
par Minibug Mer 19 Sep 2018 - 15:58

» Planétarium virtuel.
par Pedro Alvarez Mer 19 Sep 2018 - 9:28

» Demande pour Jack concernant PanExpress
par Marc Mar 18 Sep 2018 - 23:56

» Petit coucou en passant !
par Minibug Dim 16 Sep 2018 - 15:03

» bug SEVERE fnc+sub : variables globales corrompus
par silverman Dim 16 Sep 2018 - 13:38

» Verrouiller un form en avant plan
par silverman Dim 16 Sep 2018 - 12:50

» Fin de l'aventure.
par Pedro Alvarez Sam 15 Sep 2018 - 18:16

» Demande d'explications Sur File_Write & File_writeln
par Jack Sam 15 Sep 2018 - 17:26

» MEMO avec des possibilités de commande
par Oscaribout Mer 12 Sep 2018 - 1:06

» La théorie du chaos
par jean_debord Mar 11 Sep 2018 - 9:30

» Orbites de l’ensemble de Mandelbrot
par Jean Claude Lun 10 Sep 2018 - 21:08

» Version instantanée V 0.9.29i2 du 4/09/2018
par silverman Mer 5 Sep 2018 - 10:15

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2018
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
CalendrierCalendrier

Partagez | 
 

 Convertisseur pour nombres entiers signés

Aller en bas 
AuteurMessage
Marc

avatar

Nombre de messages : 865
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Convertisseur pour nombres entiers signés   Lun 27 Nov 2017 - 18:19

Bonjour à tous !

Suite à une remarque pertinente de Klaus au sujet de mon précédant convertisseur pour nombres entiers non signés,
je vous présente un deuxième convertisseur binaire vers décimal et hexadécimal pour les nombres entiers signés.




Vous pouvez l'utiliser soit :

-pour un octet signé (8 bits), dans ce cas il faut utiliser les bits 0 à 7 et prendre en compte uniquement la première ligne de calcul.
Dans l'exemple ci dessus, le première ligne de calcul est celle qui mentionne : -128   0x80
Le premier nombre est la valeur décimale de l'octet, ici négative : -128
Le deuxième nombre est la valeur hexadécimale : 0x80
Le préfixe 0x indique que c'est un nombre exprimé en hexadécimal. Sa valeur est 80

Le préfixe est utilisé pour ne pas confondre un nombre décimal avec un nombre hexadécimal.
Ainsi, il est exact, pour un entier signé, de dire que 80 = -128   scratch  ! ! ? ?
Aïe : la confusion est là ! Il faut absolument indiquer que 80 est une valeur hexadécimale. On ajoute donc un préfixe.
Suivant les langages informatiques, ce préfixe peut être Ox, &h, h ... ou parfois un suffixe indiquant la base utilisée. Ici la base 16 appelée hexadécimale.
On écrira donc 0x80 = -128 (pour un entier signé sur 1 octet).

- pour un word signé (16 bits), dans ce cas il faut utiliser les bits 0 à 15 et prendre en compte la deuxième ligne de calcul. Mêmes remarques que ci-dessus.

- pour un dword signé (32 bits), dans ce cas tous les bits de 0 à 31 sont à utiliser avec la 3ème ligne de calcul. Avec toujours les mêmes remarques que ci-dessus.

A vous de faire des essais et voir comment fonctionnent les nombres entiers signés. Voir comment on obtient un nombre négatif, voir l'étendue d'un octet...

Code:
' ------------------------------------------------------------------------------
'  PANORAMIC BINARY TO DECIMAL / HEXADECIMAL FOR SIGNED INTEGER
'  MARC - November 2017 - Panoramic v0.9.28.i12
'  http://panoramic-language.pagesperso-orange.fr/French/index.html
'  http://panoramic.forumotion.com
' ------------------------------------------------------------------------------
WIDTH 0, 900
HEIGHT 0, 400
LEFT 0,(screen_x-900)/2
TOP 0,(screen_y-400)/2
LABEL BitState, Reset
DIM i%, bit%, x, Poids%
DIM Result$, Hexa1$, Hexa2$, Hexa3$, Hexa4$, Hexa32$
DIM ButtonState%(32)
FONT_NAME 0,"Arial"
FONT_SIZE 0, 12
FOR i% = 1 TO 8
    BUTTON i%
    LEFT i%, 25*i%
    TOP i%, 110
    WIDTH i%, 25
    HEIGHT i%, 25
    ALPHA i%+100
    LEFT i%+100, (25*i%)+4
    TOP i%+100, 85
    WIDTH i%+100, 25
    HEIGHT i%+100, 25
    CAPTION i%+100,32-i%
NEXT i%
FOR i% = 9 to 16
    BUTTON i%
    LEFT i%, 10+(25*i%)
    TOP i%, 110
    WIDTH i%, 25
    HEIGHT i%, 25
    ALPHA i%+100
    LEFT i%+100, (25*i%)+14
    TOP i%+100, 85
    WIDTH i%+100, 25
    HEIGHT i%+100, 25
    CAPTION i%+100,32-i%
NEXT i%
FOR i% = 17 TO 24
    BUTTON i%
    LEFT i%, 20+(25*i%)
    TOP i%, 110
    WIDTH i%, 25
    HEIGHT i%, 25
    ALPHA i%+100
    LEFT i%+100, (25*i%)+24
    IF i% = 24 THEN LEFT i%+100, (25*i%)+28
    IF i% = 23 THEN LEFT i%+100, (25*i%)+28
    TOP i%+100, 85
    WIDTH i%+100, 25
    HEIGHT i%+100, 25
    CAPTION i%+100,32-i%
NEXT i%
FOR i% = 25 to 32
    BUTTON i%
    LEFT i%, 30+(25*i%)
    TOP i%, 110
    WIDTH i%, 25
    HEIGHT i%, 25
    ALPHA i%+100
    LEFT i%+100, (25*i%)+38
    TOP i%+100, 85
    WIDTH i%+100, 25
    HEIGHT i%+100, 25
    CAPTION i%+100,32-i%
NEXT i%
FOR i% = 1 to 32
    CAPTION i% , "0"
    ButtonState%(i%) = 0
NEXT i%
ALPHA 33
    TOP 33,35
    LEFT 33,135
    FONT_SIZE 33,16
    CAPTION 33,"BINARY TO DECIMAL / HEXADECIMAL FOR SIGNED INTEGER"
ALPHA 34
    TOP 34, 250
    LEFT 34, 250
    FONT_SIZE 34, 16
ALPHA 35
    TOP 35, 150
    LEFT 35, 250
    FONT_SIZE 35, 16
ALPHA 36
    TOP 36, 150
    LEFT 36, 250
    FONT_SIZE 36, 16
ALPHA 37
    TOP 37, 150
    LEFT 37, 250
    FONT_SIZE 37, 16
ALPHA 38
    TOP 38, 150
    LEFT 38, 250
    FONT_SIZE 38, 16
ALPHA 39
    TOP 39, 200
    LEFT 39, 250
    FONT_SIZE 39, 16
ALPHA 40
    TOP 40, 200
    LEFT 40, 250
    FONT_SIZE 40, 16
FOR i% = 41 to 44
BUTTON i%
    WIDTH i%, 100
    TOP i%,300
    LEFT i%,210*i%-8523
    CAPTION i%, "Reset "+STR$(45-i%)
    ON_CLICK i%,Reset
NEXT i%
FOR i% = 1 to 32
    ON_CLICK i%, BitState
NEXT i%
LINES()
END
' ------------------------------------------------------------------------------
BitState:
    i%=NUMBER_CLICK
    IF ButtonState%(i%) = 0
        ButtonState%(i%) = 1
        Caption i%, "1"
    ELSE
        ButtonState%(i%) = 0
        CAPTION i%,"0"
    END_IF
    Lines()    
    OctetDisplay()
    WordDisplay()
    DwordDisplay()
RETURN  
' ------------------------------------------------------------------------------
SUB OctetDisplay()
    DIM_LOCAL a$,j%
    x = 0
    FOR Bit% = 32 TO 25 STEP -1
        IF ButtonState%(Bit%) = 1 THEN x = x + POWER(2,32-Bit%)
    NEXT Bit%
    Hexa1$=HEX$(x)
    IF LEN(Hexa1$)=1 THEN Hexa1$="0"+Hexa1$
    IF ButtonState%(25)=1
        x=x-256
    END_IF    
    a$=STR$(x)+"    0x"+Hexa1$
    j%=TEXT_WIDTH(a$,35)
    LEFT 35, ((885-j%)/2)+313
    CAPTION 35, a$
END_SUB
' ------------------------------------------------------------------------------
SUB WordDisplay()
    DIM_LOCAL a$,j%
    x = 0
    FOR Bit% = 32 TO 17 STEP -1
        IF ButtonState%(Bit%) = 1 THEN x = x + POWER(2,32-Bit%)
    NEXT Bit%
    Hexa1$=HEX$(x)
    IF LEN(Hexa1$)=1 THEN Hexa1$="000"+Hexa1$
    IF LEN(Hexa1$)=2 THEN Hexa1$="00"+Hexa1$
    IF LEN(Hexa1$)=3 THEN Hexa1$="0"+Hexa1$
    IF ButtonState%(17)=1
        x=x-65536
    END_IF    
    a$=STR$(x)+"    0x"+Hexa1$
    j%=TEXT_WIDTH(a$,39)
    LEFT 39, ((885-j%)/2)+207
    CAPTION 39, a$
END_SUB
' ------------------------------------------------------------------------------
SUB DwordDisplay()
  DIM_LOCAL j%, k%, a$, b$
    x = 0
    FOR Bit% = 16 TO 1 STEP -1
        IF ButtonState%(Bit%) = 1 THEN x = x + POWER(2,16-Bit%)
    NEXT Bit%
    Hexa2$=HEX$(x)
    x = 0
    FOR Bit% = 32 TO 17 STEP -1
        IF ButtonState%(Bit%) = 1 THEN x = x + POWER(2,32-Bit%)
    NEXT Bit%
    Hexa1$=HEX$(x)
    IF LEN(Hexa1$)< 4 THEN Hexa1$=STRING$(4-LEN(Hexa1$),"0")+Hexa1$
    IF LEN(Hexa2$)< 4 THEN Hexa2$=STRING$(4-LEN(Hexa2$),"0")+Hexa2$
    x = 0
    Hexa32$=Hexa2$ + Hexa1$
    x=HEX(Hexa32$)
    Result$=""
    k%=0
    a$=STR$(x)
    j%=LEN(a$)
    FOR i%= j% TO 1 STEP -1
        k%=k%+1
        b$=MID$(a$,i%,1)
        Result$=b$+Result$
        IF k%=3 AND i% > 1
            Result$=chr$(46)+Result$
            K%=0
        END_IF
    NEXT i%
    Result$=Result$+"     0x"+Hexa32$
    j%=TEXT_WIDTH(Result$,34)
    LEFT 34, (885-j%)/2
    CAPTION 34, Result$
END_SUB
' ------------------------------------------------------------------------------
SUB Lines()
    2D_LINE 660,174,851,174
    2D_LINE 448,224,853,224
    2D_LINE 30,274,853,274
    2D_LINE 660,159,660,174
    2D_LINE 850,159,850,174
    DISPLAY
    2D_LINE 448,209,448,224
    2D_LINE 852,209,852,224
    2D_LINE 30,259,30,274
    2D_LINE 852,259,852,274
    DISPLAY
END_SUB
' ------------------------------------------------------------------------------
Reset:
    i% = NUMBER_CLICK
    SELECT i%
        CASE 41
            FOR Bit%=1 to 8
                ButtonState%(Bit%)=0
                CAPTION Bit%, 0
            NEXT Bit%
        CASE 42
            FOR Bit%=9 to 16
                ButtonState%(Bit%)=0
                CAPTION Bit%, 0
            NEXT Bit%
        CASE 43
            FOR Bit%=17 to 24
                ButtonState%(Bit%)=0
                CAPTION Bit%, 0
            NEXT Bit%
        CASE 44
            FOR Bit%=25 to 32
                ButtonState%(Bit%)=0
                CAPTION Bit%, 0
            NEXT Bit%
    END_SELECT
    Lines()    
    OctetDisplay()
    WordDisplay()
    DwordDisplay()
RETURN

EDIT du 28/11/2017 : Mise à jour du source, numérotation des bits de 0 à 31.


Dernière édition par Marc le Mar 28 Nov 2017 - 21:24, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Convertisseur pour nombres entiers signés   Lun 27 Nov 2017 - 18:29

C'est très bien, ça !

Je chipote: tu numérotes des bits de 1 à 32. Pour la part, j'aurais choisi de les numéroter de 0 à 31. Chaque bit corrspond ainsi à son exposant pour a puissance de 2:
1 = 2^^0 = bit 0
2 = 2^^1 = bit 1
etc.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc

avatar

Nombre de messages : 865
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Convertisseur pour nombres entiers signés   Lun 27 Nov 2017 - 18:42

Informatiquement parlant, c'est vrai que c'est plus juste de mettre 0 à 31.

Mais pour compter, il est plus simple d'aller de 1 à 32...

Quelle formule choisir ?

Je suis prêt à modifier.

Quelqu'un d'autre ? D'autres avis ? ....
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
jean_debord

avatar

Nombre de messages : 822
Age : 64
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Convertisseur pour nombres entiers signés   Mar 28 Nov 2017 - 9:27

Je partage l'avis de Klaus. 0 à 31 est plus conforme aux notations informatiques habituelles. On aura moins de bugs en comptant comme cela.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://www.unilim.fr/pages_perso/jean.debord/index.htm
Marc

avatar

Nombre de messages : 865
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Convertisseur pour nombres entiers signés   Mar 28 Nov 2017 - 21:29

Sur une remarque de Klaus :

=> Adoption de la numérotation logique des bits en commençant de 0 jusqu'à 31.

Premier post mis à jour.

Merci Klaus !

Merci à Jean et tous les lecteurs.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Convertisseur pour nombres entiers signés   

Revenir en haut Aller en bas
 
Convertisseur pour nombres entiers signés
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Stylistic S01, un smartphone pour séniors signé Orange et Fujitsu
» Fennec : mavigateur pour votre mobile signé Mozilla
» pour jouer avec les chiffres et les nombres
» un logiciel pour mac?
» convertir fichiers.asc pour gps garmin

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: