Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [JAVA] aiuto su sintassi cast

    salve

    come da titolo, qualcuno mi può cortesemente spiegare a parole che cosa fa questo cast (non capisco come vengono considerati gli operatori logici dentro al cast)


    codice:
    tmp = (int) ((Tmp_Data_PLC[x]<<8)|(int)(Tmp_Data_PLC[x+1] & 0x000000FF));
    grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Scomponiamo l'espressione.

    (Tmp_Data_PLC[x]<<8)
    è una moltiplicazione (shift a sinistra). Il valore Tmp_Data_PLC viene moltiplicato per (2 elevato alla 8). Chiamiamo X questo risultato

    (Tmp_Data_PLC[x+1] & 0x000000FF)
    è un AND bit a bit. In pratica, con questa operazione vengono isolati gli ultimi 2 bit del valore Tmp_Data_PLC[x+1]. Chiamiamo Y questo risultato.

    Y viene castato a int (posso supporre, quindi, che Tmp_Data_PLC sia una matrice di Long, altrimenti avrebbe poco senso).

    Infine viene calcolato X | Y (è un OR bit a bit: il risultato avrà tutti i bit a 1 di X e tutti i bit a 1 di Y). Questo risultato viene, alla fine, castato a int perchè, se Tmp_Data_PLC è effettivamente una matrice di long (come ho ipotizzato), allora X sarà un long e l'OR bit a bit restituirà un valore long, che dovrà essere castato a int per poter essere assegnato a tmp, che evidentemente è di tipo int.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    grazie 1000...

    in realtà temp_Data_PLC è un vettore di byte...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da italo2008
    in realtà temp_Data_PLC è un vettore di byte...
    Allora tutti quei cast sono perfettamente inutili. Valori più piccoli di un int vengono automaticamente promossi a int durante le operazioni bitwise e anche per l'assegnamento a tmp la promozione sarebbe effettuata implicitamente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    scusami, ma c'è qualcosa che non mi torna...

    facendo il debug, posizionando un breakpoint immediatamente dopo l'istruzione che ho postato, ho che:

    x=16
    tmp_data_PLC [x] = 19 (binario 10011)
    tmp_data_PLC [x+1] = -120 (binario 10001000)

    secondo quanto tu dici, io dovrei considerare solo gli ultimi due bit di tmp_data_PLC [x+1], cioè 00, perciò, riprendendo la tua notazione, avrei

    X=1001100000000
    Y=0

    e il risultato finale sarebbe tmp = 1001100000000

    in realtà ho che tmp (in binario) vale 1001110001000

    è come se avesse fatto un OR tra tmp_data_PLC [x] e tmp_data_PLC [x+1].

    Ma allora cosa fa l'istruzione Tmp_Data_PLC[x+1] & 0x000000FF ?

    Non è che l'and lo fa con gli ultimi 8 bit di Tmp_Data_PLC[x+1] e non solo con gli ultimi due? Mi è venuto da pensare questo perchè FF in binario è 11111111. Se fosse così l'And sarebbe inutile visto che tmp_data_PLC è un array di byte...

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    C'è che ho scritto una cavolata...

    (Tmp_Data_PLC[x+1] & 0x000000FF)

    Non vengono isolati gli ultimi 2 bit, ma gli ultimi 8. Quindi il byte meno significativo. Essendo che Tmp_Data_PLC è una matrice di byte... quella AND è del tutto ininfluente.

    Oggi ho le traveggole...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.