这是我正在使用的简单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。我将其值更改为无济于事。为什么未为其分配值?
类型的表示取决于机器。根据您似乎在描述的计算机行为,长的long可能会收到长的内存空间的两倍,并且您的计算机使用低端数字表示。
当您调用printf时,参数以相反的顺序推入堆栈(内存顺序通常从高到低;以字节为单位进行分配/假定的方式,例如在我的(旧)机器上):
mem allocated long(int) long long
arg2 4 8
arg1 4 8
fmt string x x
其中x是格式字符串的字节大小。当您打印一个long long变量(例如8个字节),然后再打印一个int格式说明符(%d)的long变量(例如4个字节)时,这在long情况下可以正常工作,long和int可能具有您计算机上的相同字节宽度。
由于时间不长,它们的宽度可能是上面假设的两倍。当您查看上面的堆栈时,这意味着如果推入2个long long,但使用%d说明符,则printf假设fmt字符串之后的前4个字节是第一个参数,接下来的4个字节是第二个参数。 。但是,这8个字节实际上构成了第一个long long参数。用little-endian表示法,前4个字节是其低位字节,与您的第一个变量一致-因此arg 1打印良好。接下来的4个字节将是高位字节-全部为0,因此printf始终为您的第二个变量打印0。正如它应该。
阅读格式说明符:适当时使用%d,%ld等;并始终使用警告进行编译,因为您的编译器会通过发出警告来提示您出了什么问题(带有gcc的-Wall)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句