很简单的 数据溢出问题。
随便写了个 如下一个很简单的例子。
#include "stdio.h "
int t(int a, unsigned int b)
{
return a/b;
}
int main()
{
printf( "%d\n ",t(-50,2));
return 0;
}
//输出结果是:2147483623。
原因是unsigned 十无符号的整形不能表示-50/2。所以取低32位的结果就是2147483623
我的问题是:printf( "%x\n ",t(-50,2));//这个不是以16进制输出来结果值吗,结果十7FFFFFE7
printf( "%p\n ",t(-50,2));//这个不是结果值的地址吗,结果为什么也是7FFFFFE7?
我哪里理解错了》结果值等于地址值?
一时反映不上来。各位帮忙理下思路。。。。。
[解决办法]
printf 是函数,对于 t(-50,2)而言,C/C++的处理是:先计算函数值,再把值入栈,传给 printf.
%x 和 %p 都是对同一个值进行格式化,当然都是 7FFFFFE7 了.
[解决办法]
-50用16进制表示为:
80000032
写成无符号形式为:
2147483698
你这个运算结果为:
2147483623
[解决办法]
t(-50,2)是一个函数,所以其返回值一个内存地址。地址是用16进制表示的。所以%x,%p打印出来的内容一样。
[解决办法]
[解决办法]
传入 printf 的是 0x7FFFFFE7,与前面是什么格式描述符无关.
"%x"是让printf把0x7FFFFFE7按16进制输出
"%p"是让printf把0x7FFFFFE7按地址形式输出.而在 C/C++ 里,地址格式,实际上就是无符号 16 进行格式
[解决办法]
有符号数和无符号数运算时,首先把有符号数转换成无符号数
printf的格式化输出是“把输入数据按指定格式输出”,而不是“对输入数据做指定操作后输出”
你给它的那个值不会变,格式字符串是用来让它理解你给它的是什么
[解决办法]
偶理解楼主的意思,偶也觉得蹊跷。回去做做实验看看结果