不同调用时显示的字节不同

时间:2018-12-07 07:58:18

标签: c printf

我正在使用下面的代码读取结构中的位/字节。 当DEBUG1时,每行以两种不同的方法打印,否则仅使用一种方法。

代码:

#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中除一行以外的所有内容均为空白。 我只是想知道为什么会这样。

如果有更好的打印位/字节的方法,也可以启发我。

Nb:我正在使用在线编译器(onlinegdb.com)进行测试

2 个答案:

答案 0 :(得分:0)

您要在此处打印的是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   

您要将上述代码添加到代码段中。

代码段中的函数(addsub)的地址可能会更改。

  

注意::您在此处未遵循严格的别名规则。

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

答案 1 :(得分:0)

这似乎与您使用的编译器有关,我看不出代码返回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会警告您的无法预测的行为。