Aula #3 Função 'print_bytes' #17

Open
opened 2025-06-01 09:43:02 -03:00 by drginfo · 1 comment

Bom dia a todos, estava analisando a função print_bytes, da aula, então resolvi acrescentar algumas linhas extras para verificar o que acontece em cada fase da função e os seus respectivos valores, inclusive para entender o resultado da expressão ternária, apresentando os endereços e e valores associados a cada byte. @Blau, poderia conferir se o que eu acrescentei está correto?

Código com linhas extras


#include <stdio.h>

void print_bytes(char *label, void *addr, size_t size);

int main(void) {

    int num = 100000;
    int sqr_int = num * num;
    unsigned long sqr_long = (unsigned long)num * num;
//--------------
    print_bytes("---------------> num", &num, sizeof(num));
    printf("Resultado -> %d\n", num);
    
    print_bytes("-----------> sqr_int", &sqr_int, sizeof(sqr_int));
    printf("Resultado -> %d\n", sqr_int);
    
    print_bytes("----------> sqr_long", &sqr_long, sizeof(sqr_long));
    printf("Resultado -> %lu\n", sqr_long);
//--------------    
    return 0;
}

void print_bytes(char *label, void *addr, size_t size) {

    unsigned char *bytes  = (unsigned char *)addr;

    //printf("%p - %s - ", bytes, label);
    //printf("%p - %s\n", bytes, label);
    printf("%s - %p\n", label, bytes);

        // Se a avaliação da expressão 'i > (size -1)' retornar 0 (falso), 
        // ela receberá o valor que vem depois dos ':' que é o valor
        // apontado por bytes[i].
        //
        // Se a avaliação da expressão 'i > (size -1)' retornar 1 (verdadeiro).
        // ela receberá o valor que vem depois da '?'
        // == 0 falso
        // != 0 verdadeiro

    for (size_t i = 0; i < 8; i++) {
            int res = i > (size - 1);
            printf("| Endereço do byte[i]: %p | Retorno de [i]: %d ", &bytes[i], res);
            printf("| Valor no byte: %02x |\n", i > (size - 1) ? 0 : bytes[i]);
            //printf("|>Retorno de [i]: %d : Endereço do Byte[i]: %p<| \n", res, &bytes[i]);
    }
}

Código original:


#include <stdio.h>

void print_bytes(char *label, void *addr, size_t size);

int main(void) {
    
    int num = 100000;

    int sqr_int = num * num;
    unsigned long sqr_long = (unsigned long)num * num;

    print_bytes("num     ", &num, sizeof(num));
    printf("-> %d\n", num);
    
    print_bytes("sqr_int ", &sqr_int, sizeof(sqr_int));
    printf("-> %d\n", sqr_int);
    
    print_bytes("sqr_long", &sqr_long, sizeof(sqr_long));
    printf("-> %lu\n", sqr_long);
    
    return 0;
}


void print_bytes(char *label, void *addr, size_t size) {

    unsigned char *bytes  = (unsigned char *)addr;

    printf("%p - %s - ", bytes, label);

    for (size_t i = 0; i < 8; i++)
        printf("%02x ", i > (size - 1) ? 0 : bytes[i]);
}
Bom dia a todos, estava analisando a função print_bytes, da aula, então resolvi acrescentar algumas linhas extras para verificar o que acontece em cada fase da função e os seus respectivos valores, inclusive para entender o resultado da expressão ternária, apresentando os endereços e e valores associados a cada byte. @Blau, poderia conferir se o que eu acrescentei está correto? Código com linhas extras ----------------------------------------- ``` #include <stdio.h> void print_bytes(char *label, void *addr, size_t size); int main(void) { int num = 100000; int sqr_int = num * num; unsigned long sqr_long = (unsigned long)num * num; //-------------- print_bytes("---------------> num", &num, sizeof(num)); printf("Resultado -> %d\n", num); print_bytes("-----------> sqr_int", &sqr_int, sizeof(sqr_int)); printf("Resultado -> %d\n", sqr_int); print_bytes("----------> sqr_long", &sqr_long, sizeof(sqr_long)); printf("Resultado -> %lu\n", sqr_long); //-------------- return 0; } void print_bytes(char *label, void *addr, size_t size) { unsigned char *bytes = (unsigned char *)addr; //printf("%p - %s - ", bytes, label); //printf("%p - %s\n", bytes, label); printf("%s - %p\n", label, bytes); // Se a avaliação da expressão 'i > (size -1)' retornar 0 (falso), // ela receberá o valor que vem depois dos ':' que é o valor // apontado por bytes[i]. // // Se a avaliação da expressão 'i > (size -1)' retornar 1 (verdadeiro). // ela receberá o valor que vem depois da '?' // == 0 falso // != 0 verdadeiro for (size_t i = 0; i < 8; i++) { int res = i > (size - 1); printf("| Endereço do byte[i]: %p | Retorno de [i]: %d ", &bytes[i], res); printf("| Valor no byte: %02x |\n", i > (size - 1) ? 0 : bytes[i]); //printf("|>Retorno de [i]: %d : Endereço do Byte[i]: %p<| \n", res, &bytes[i]); } } ``` Código original: ------------------------- ``` #include <stdio.h> void print_bytes(char *label, void *addr, size_t size); int main(void) { int num = 100000; int sqr_int = num * num; unsigned long sqr_long = (unsigned long)num * num; print_bytes("num ", &num, sizeof(num)); printf("-> %d\n", num); print_bytes("sqr_int ", &sqr_int, sizeof(sqr_int)); printf("-> %d\n", sqr_int); print_bytes("sqr_long", &sqr_long, sizeof(sqr_long)); printf("-> %lu\n", sqr_long); return 0; } void print_bytes(char *label, void *addr, size_t size) { unsigned char *bytes = (unsigned char *)addr; printf("%p - %s - ", bytes, label); for (size_t i = 0; i < 8; i++) printf("%02x ", i > (size - 1) ? 0 : bytes[i]); } ```

@drginfo wrote in #17 (comment):

printf("%02x ", i > (size - 1) ? 0 : bytes[i]);

O lance do condicional ternário aqui neste caso é para imprimir 0s para os bytes (excedentes) das variáveis do tipo int e alinhar os bytes com as variáveis do tipo long

                            |---int---|
0x7ffe8b900ec0 - num      - a0 86 01 00 00 00 00 00 -> 100000
0x7ffe8b900ec4 - sqr_int  - 00 e4 0b 54 00 00 00 00 -> 1410065408
0x7ffe8b900ec8 - sqr_long - 00 e4 0b 54 02 00 00 00 -> 10000000000
                            |--------long---------|
@drginfo wrote in https://bolha.dev/blau_araujo/cblc/issues/17#issue-17: > printf("%02x ", i > (size - 1) ? 0 : bytes[i]); O lance do condicional ternário aqui neste caso é para imprimir 0s para os bytes (excedentes) das variáveis do tipo int e alinhar os bytes com as variáveis do tipo long ```text |---int---| 0x7ffe8b900ec0 - num - a0 86 01 00 00 00 00 00 -> 100000 0x7ffe8b900ec4 - sqr_int - 00 e4 0b 54 00 00 00 00 -> 1410065408 0x7ffe8b900ec8 - sqr_long - 00 e4 0b 54 02 00 00 00 -> 10000000000 |--------long---------| ```
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/cblc#17
No description provided.