байты отображаются по-разному при вызове по-разному - PullRequest
0 голосов
/ 07 декабря 2018

Я использую приведенный ниже код для чтения битов / байтов в структуре.Каждая строка печатается двумя разными способами, когда DEBUG равно 1, иначе она использует только один метод.

Код:

#include <stdio.h>
#define DEBUG 0

typedef struct n{
    int a;
    int b;
    int (*add)(struct n*, int,int);
    int (*sub)(struct n*, int,int);
} num;
int add (num *st, int a, int b){}
int sub(num *st, int a, int b){}

int main(){
    num* var = calloc(1,sizeof(num));
    var->add = add;
    var->sub = sub;
    var->a = 13;
    var->b = 53;

    long int *byte = (long int*)var;
    int i;
    int j;

    for(i=0;i<6;i++){
#       if DEBUG == 1
        for(j=0;j<64;j++){
            printf("%d",( *(byte+i) & (1UL<<(63-j)) )?1:0 );
            putchar( ((j+1)%8 == 0)?' ':'\0' );
        }
        putchar('\n');
#       endif   
    printf("0x%06x %06x\n",(*(byte+i) >> 32), *(byte+i));
    }  
    printf("\n0x%x\n",var->add);
    printf("0x%x\n",var->sub); 
}

Выход 1: (DEBUG==1)

00000000 00000000 00000000 00110101 00000000 00000000 00000000 00001101 
0x000035 00000d
00000000 00000000 00000000 00000000 00000000 01000000 00000111 01110000 
0x000000 400770
00000000 00000000 00000000 00000000 00000000 01000000 00000111 01100000 
0x000000 400760
00000000 00000000 00000000 00000000 00000000 00000010 00001111 11100001 
0x000000 020fe1
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
0x000000 000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
0x000000 000000

0x400770
0x400760

Выход2: (DEBUG==0)

0x000000 000000
0x000000 000000
0x000000 000000
0x000000 020fe1
0x000000 000000
0x000000 000000

0x400640
0x400630 

Как вы видите, все, кроме одной строки, пусто в выводе 2. Мне просто интересно узнать, почему это происходит.

Также сообщите мне, если есть лучший способ печатать биты / байты.

Примечание: я использую онлайн-компилятор ( onlinegdb.com ) для тестирования

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Это похоже на проблему с компилятором, который вы используете, я не вижу какой-либо конкретной причины, по которой ваш код будет возвращать 0.Когда ваш код скомпилирован с GCC и запущен, результаты выглядят следующим образом:

Debug = 1

00000000 00000000 00000000 00001101 00000000 00000000 00000000 00001101
0x00000d 00000d
00000000 00000000 00000000 00110101 00000000 00000000 00000000 00110101
0x000035 000035
00000000 01000000 00010101 01100000 00000000 01000000 00010101 01100000
0x401560 401560
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x000000 000000
00000000 01000000 00010101 01110010 00000000 01000000 00010101 01110010
0x401572 401572
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x000000 000000

0x401560
0x401572

И Debug = 0:

0x00000d 00000d
0x000035 000035
0x401560 401560
0x000000 000000
0x401572 401572
0x000000 000000

0x401560
0x401572

Я бырекомендуем установить GCC на свой компьютер и скомпилировать код с помощью -Wall.В этом коде есть несколько вещей, которые затрудняют понимание и могут привести к непредсказуемому поведению, о котором -Wall предупредит вас.

0 голосов
/ 07 декабря 2018

Здесь вы печатаете адрес functions.

printf("\n0x%x\n",var->add);
printf("0x%x\n",var->sub);

Когда вы включаете DEBUG.

#       if DEBUG == 1
        for(j=0;j<64;j++){
            printf("%d",( *(byte+i) & (1UL<<(63-j)) )?1:0 );
            putchar( ((j+1)%8 == 0)?' ':'\0' );
        }
        putchar('\n');
#       endif   

Вы добавляете указанный выше код в свой сегмент кода.

Следовательно, адреса функций (add и sub) внутри сегмента кода могут измениться.

Примечание :: Здесь вы не следуете строгому правилу алиасинга.

    long int *byte = (long int*)var;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...