无论变量如何,每次变量接收0x00

时间:2014-05-22 02:40:06

标签: c variables zero local-variables

这是我正在使用的简单C文件。基本上,我希望测试每个ASCII字符以查看它们是否是极性对立(例如0x5b5b5b5b和0x24242424,其中5b nad 24是ASCII)。

#include <stdio.h>
#define SHOW 0

int main(){
    char c = '\x00';
    int i = 100;
    long long var1 = 0x5b5b5b5b;
    long long var2 = 0x24242424;
    printf("%d - %d - %d\n", i, var1, var2);
    i &= var1;
    printf("%d - %d - %d\n", i, var1, var2);
    i &= var2;
    printf("%d - %d - %d\n", i, var1, var2);

    /*
     * If they want to actually list them all, keep SHOW = 1
     */
    if(SHOW)
        for(c = '\x20'; c < 0x7E; c++)
            if(~c - 0xffffff00 - 0x80 > 0x20 && ~c - 0xffffff00 - 0x80 <= 0x7e)
                printf("AND reg, %x\nAND reg, %x\n\n", c, (~c - 0xffffff00 - 0x80));
    /*
     * If they want to test var1 and var2
     */
    if(!SHOW)
        if(i==0)
            printf("0x%x and 0x%x are opposites!\n", var1, var1);
    //Why does the second one return 0 every time?
}

我有一些调试printf,错误表明var2没有被填充。我改变了它的价值无济于事。为什么没有分配值?

2 个答案:

答案 0 :(得分:2)

类型的表示与机器有关。根据您的机器上的行为,您似乎在描述,很长一段时间可能会收到长时间接收的两倍内存空间,并且您的计算机使用little-endian数字表示。

当你调用printf时,参数在堆栈上以相反的顺序被推送(内存顺序通常更高,通常更低;假定的字节分配/如何,例如,在我的(旧)机器上):

mem allocated     long(int)    long long

     arg2            4             8
     arg1            4             8
  fmt string         x             x   

其中x是格式字符串的字节大小。当您使用int(%d)的格式说明符打印长long变量(例如,8个字节)和更长的变量(例如,4个字节)时,这适用于长情况,long和int可能具有机器上的字节宽度相同。

正如上面所假设的那样,它们的长度可能不长。当您查看上面的堆栈时,这意味着在推送2个长long但使用%d说明符的情况下,printf假定fmt字符串是第一个参数后的前4个字节,接下来的4个字节是第二个参数。但是,这8个字节实际上构成了第一个long long参数。在little-endian表示法中,前4个字节是它的低位字节,它与你的第一个变量一致 - 所以arg 1打印得很好。接下来的4个字节将是更高阶的字节 - 全部为0,因此printf为第二个变量打印始终为0。正如它应该。

阅读格式说明符:根据需要使用%d,%ld等;并且始终使用警告进行编译,因为编译器会通过发出警告(-Wall with gcc)给出一个提示错误的提示。

答案 1 :(得分:0)

我已将long long更改为long,从而解决了该问题。有人会介意解释这是为什么吗?谢谢!