这是我正在使用的简单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没有被填充。我改变了它的价值无济于事。为什么没有分配值?
答案 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
,从而解决了该问题。有人会介意解释这是为什么吗?谢谢!