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
» StratégoV8 et V9
par Minibug Aujourd'hui à 1:10

» Rotation d'une image d'un angle quelconque
par JL35 Hier à 23:02

» GRID_LOAD
par Jean Claude Hier à 21:04

» HVIEWER
par Yannick Hier à 20:31

» KGF_dll - nouvelles versions
par Klaus Mar 16 Jan 2018 - 21:28

» Déformation d'image en trapèze
par mindstorm Mar 16 Jan 2018 - 21:06

» Mah-Jong américain
par Jean Claude Lun 15 Jan 2018 - 19:37

» Problème avec Deepl
par Klaus Lun 15 Jan 2018 - 0:34

» Quelques nouvelles ...
par Jean Claude Ven 12 Jan 2018 - 22:40

» Renommer les instructions ITEM_... ?
par Jicehel Ven 12 Jan 2018 - 18:56

» Ludothèque Panoramic
par jjn4 Ven 12 Jan 2018 - 18:11

» sous-programmes et fonctions
par Jack Ven 12 Jan 2018 - 17:51

» Mah-Jong français
par Jean Claude Jeu 11 Jan 2018 - 22:15

» panoramic 0.9.28
par gigi75 Ven 5 Jan 2018 - 14:06

» Un jeu qui va vous énerver!
par Jean Claude Jeu 4 Jan 2018 - 22:05

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Janvier 2018
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
293031    
CalendrierCalendrier

Partagez | 
 

 Convertisseur pour nombres entiers signés

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Marc



Nombre de messages : 582
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Convertisseur pour nombres entiers signés   Lun 27 Nov 2017 - 20: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.top-forum.net
' ------------------------------------------------------------------------------
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 - 23:24, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Convertisseur pour nombres entiers signés   Lun 27 Nov 2017 - 20: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



Nombre de messages : 582
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Convertisseur pour nombres entiers signés   Lun 27 Nov 2017 - 20: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 : 771
Age : 63
Localisation : Limoges
Date d'inscription : 21/09/2008

MessageSujet: Re: Convertisseur pour nombres entiers signés   Mar 28 Nov 2017 - 11: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



Nombre de messages : 582
Age : 56
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Convertisseur pour nombres entiers signés   Mar 28 Nov 2017 - 23: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
Voir le sujet précédent Voir le sujet suivant 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: