| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1645 人关注过本帖, 2 人收藏
标题:【自学妹子虚心求教】 小题求解
只看楼主 加入收藏
Envy7s
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-1-5
结帖率:100%
收藏(2)
已结贴  问题点数:20 回复次数:20 
【自学妹子虚心求教】 小题求解
题1:

long a = Oxffffffff;
int b = a;
printf(“%d”,b);

为何输出结果为-1
2015-01-05 18:41
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
因为-1的补码形式是0xffffffff

另外 你写的是 Oxffffffff 大丈夫?
2015-01-05 18:44
Envy7s
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-1-5
收藏
得分:0 
回复 2楼 zklhp
谢谢回复  还是没大弄懂。。 大丈夫是啥
2015-01-05 18:47
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用Envy7s在2015-1-5 18:47:17的发言:

谢谢回复  还是没大弄懂。。 大丈夫是啥

大丈夫是日语没关系的意思

记住这个:

计算机里面有符号数的存储 最高位是符号位 正数是0负数是1 转化的时候 正数和原数一样 负数是绝对值取反+1
负数想还原成原来的数 也是取反+1

对于双字的-1 绝对值1 取反是0xfffffffe +1就是 0xffffffff
还原0xffffffff 取反是0 +1是1 那么就是-1了


2015-01-05 18:55
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 4楼 zklhp
这这这不是越说越糊涂么,你是想让自学小妹进入死循环吗?
自学小妹要去学学计算机原理或许能明白点啥,如果实在不能明白,其实可以这样理解有符号数,以0为中心,0 的左边是负数,右边是正数,左边减一个就是-1,右边加一个就是+1,所以一个32位的long类型数的0x00000000减一个不就成了0xffffffff(反过来,如果一个循环计数器的值在0xffffffff基础上加一个就变成了0x00000000),所以在有符号数的表示中0xffffffff的值就是-1,至于4楼所说的补码,是由于cpu的特殊电路造成的,通常设计cpu的加法电路很简单,为了计算减法,就采取补码运算,对被减数变成补码后只需要和减数做加法就可以得到正确结果了。如果要详细讲还是要费一番口舌的,估计自学小妹难以消化。

能编个毛线衣吗?
2015-01-05 19:35
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用wmf2014在2015-1-5 19:35:28的发言:

这这这不是越说越糊涂么,你是想让自学小妹进入死循环吗?
自学小妹要去学学计算机原理或许能明白点啥,如果实在不能明白,其实可以这样理解有符号数,以0为中心,0 的左边是负数,右边是正数,左边减一个就是-1,右边加一个就是+1,所以一个32位的long类型数的0x00000000减一个不就成了0xffffffff(反过来,如果一个循环计数器的值在0xffffffff基础上加一个就变成了0x00000000),所以在有符号数的表示中0xffffffff的值就是-1,至于4楼所说的补码,是由于cpu的特殊电路造成的,通常设计cpu的加法电路很简单,为了计算减法,就采取补码运算,对被减数变成补码后只需要和减数做加法就可以得到正确结果了。如果要详细讲还是要费一番口舌的,估计自学小妹难以消化。

我感觉你讲的这些才难懂
2015-01-05 20:09
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
慢慢理解,大丈夫大丈夫。

梦想拥有一台龙芯3A-4000
2015-01-05 23:59
ventress
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2014-12-29
收藏
得分:0 
学c不就是从2进制学起吗。 谭的教材就是啊。。
2015-01-06 08:28
书生等待
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:280
专家分:689
注 册:2013-2-22
收藏
得分:0 
哈哈,挂个小妹,就是非常有用
2015-01-06 09:54
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
计算机的整数是循环编制的,从二进制000开始,依次加1成001、010、011……,到111之后,再加又变回000,反过来减也是一样。问题在于我们要求程序怎么解释满格的那个111,当我们把数字理解为无符号整数的时候,111是十进制的7;当我们把数字理解为有符号整数的时候,它是-1,这就是再加1会变成0的原因。对无符号数据,永远不可能出现负值!

再强调一遍:同一个二进制数据111,显示成7还是-1,取决于编程者要求显示为有符号数还是无符号数,计算机内部是不管的。

测试如下代码,看看结果:
int x = 0xff;
printf("%d,%u\n", x, x);




[ 本帖最后由 TonyDeng 于 2015-1-6 10:16 编辑 ]

授人以渔,不授人以鱼。
2015-01-06 10:14
快速回复:【自学妹子虚心求教】 小题求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030051 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved