Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: 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 0x80Le 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 ! ! ? ? 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 - 21:24, édité 2 fois | |
|