读书人

很简单的 数据溢出有关问题

发布时间: 2012-11-20 09:55:43 作者: rapoo

很简单的 数据溢出问题。
随便写了个 如下一个很简单的例子。

#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 是函数,对于 t(-50,2)而言,C/C++的处理是:先计算函数值,再把值入栈,传给 printf.
%x 和 %p 都是对同一个值进行格式化,当然都是 7FFFFFE7 了.


p是打映出该数字的内存地址
x是打印出无0x的16进制

我记得应该是这样的??

[解决办法]
传入 printf 的是 0x7FFFFFE7,与前面是什么格式描述符无关.
"%x"是让printf把0x7FFFFFE7按16进制输出
"%p"是让printf把0x7FFFFFE7按地址形式输出.而在 C/C++ 里,地址格式,实际上就是无符号 16 进行格式

[解决办法]
有符号数和无符号数运算时,首先把有符号数转换成无符号数

printf的格式化输出是“把输入数据按指定格式输出”,而不是“对输入数据做指定操作后输出”
你给它的那个值不会变,格式字符串是用来让它理解你给它的是什么
[解决办法]
偶理解楼主的意思,偶也觉得蹊跷。回去做做实验看看结果

读书人网 >VC/MFC

热点推荐