首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-11-20 
很简单的 数据溢出问题。随便写了个如下一个很简单的例子。#includestdio.h intt(inta,unsignedintb){retu

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

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

热点排行