很简单的 数据溢出问题。

tbg1986tbg 2012-10-26 10:01:11
随便写了个 如下一个很简单的例子。

#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?

我哪里理解错了》结果值等于地址值?

一时反映不上来。各位帮忙理下思路。。。。。
...全文
261 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2012-11-08
  • 打赏
  • 举报
回复
偶没想明白是咋回事,
tbg1986tbg 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
偶理解楼主的意思,偶也觉得蹊跷。回去做做实验看看结果
[/Quote]
tiger 你回去试的结果如何呢/有何感想???
傻X 2012-10-27
  • 打赏
  • 举报
回复
偶理解楼主的意思,偶也觉得蹊跷。回去做做实验看看结果
baichi4141 2012-10-27
  • 打赏
  • 举报
回复
有符号数和无符号数运算时,首先把有符号数转换成无符号数

printf的格式化输出是“把输入数据按指定格式输出”,而不是“对输入数据做指定操作后输出”
你给它的那个值不会变,格式字符串是用来让它理解你给它的是什么
icessl 2012-10-27
  • 打赏
  • 举报
回复
传入 printf 的是 0x7FFFFFE7,与前面是什么格式描述符无关.
"%x"是让printf把0x7FFFFFE7按16进制输出
"%p"是让printf把0x7FFFFFE7按地址形式输出.而在 C/C++ 里,地址格式,实际上就是无符号 16 进行格式
Eleven 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

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


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

我记得应该是这样的??
[/Quote]
p
Pointer to void
Prints the argument as an address in hexadecimal digits.

x
int
Unsigned hexadecimal integer, using "abcdef."
wqvbjhc 2012-10-26
  • 打赏
  • 举报
回复
t(-50,2)是一个函数,所以其返回值一个内存地址。地址是用16进制表示的。所以%x,%p打印出来的内容一样。
tbg1986tbg 2012-10-26
  • 打赏
  • 举报
回复
int a=5;
int *p=&a;
printf("%p,%x\n",p,&a); //这样输出的结果应该是一样的。都是地址。

printf("%p,%x\n",a,a); //这样输出的值为什么也是一样的?如何理解这个?
tbg1986tbg 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
printf 是函数,对于 t(-50,2)而言,C/C++的处理是:先计算函数值,再把值入栈,传给 printf.
%x 和 %p 都是对同一个值进行格式化,当然都是 7FFFFFE7 了.
[/Quote]

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

我记得应该是这样的??
  • 打赏
  • 举报
回复
-50用16进制表示为:
80000032
写成无符号形式为:
2147483698
你这个运算结果为:
2147483623
icessl 2012-10-26
  • 打赏
  • 举报
回复
printf 是函数,对于 t(-50,2)而言,C/C++的处理是:先计算函数值,再把值入栈,传给 printf.
%x 和 %p 都是对同一个值进行格式化,当然都是 7FFFFFE7 了.
Eleven 2012-10-26
  • 打赏
  • 举报
回复
return a/b;
-->
return a/(int)b;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧