| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5210 人关注过本帖, 1 人收藏
标题:关于unsigned int的 问题
只看楼主 加入收藏
starzq00123
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2012-7-20
收藏(1)
 问题点数:0 回复次数:20 
关于unsigned int的 问题
#include <stdio.h>
main()
{int a,b,c;
unsigned u,d;
a=12;b=-24;u=10;c=a+u;d=b+u;

printf("a+u=%d,b+u=%d\n",c,d);
}

我定义的d是无符号的整型变量,算出来的d=b+u=-14,但因为d是无符号的整型变量,不应该显示的是14吗?
为什么我的执行结果却是b+u=-14.  无符号的变量能和有符号的变量做运算么? 结果若定义位unsigned的就是无论正负都是正的么?
搜索更多相关主题的帖子: include 
2012-07-24 14:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
噢,这问题超级经典,各位初学者都来讨论一下。

授人以渔,不授人以鱼。
2012-07-24 14:45
starzq00123
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2012-7-20
收藏
得分:0 
版主 还是你来吧! 你有QQ不 想和你交个朋友!拯救我们这些小白们吧
2012-07-24 14:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你们先讨论一下吧,书上是没有明确讲这样的问题,但也不至于从书上找不到答案,先看看书,想一段时间,不要一下子给答案。

授人以渔,不授人以鱼。
2012-07-24 14:52
starzq00123
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2012-7-20
收藏
得分:0 
苦命的孩子没有书 我是看的网上看的谭浩强讲义的教学视频 视频上定义的d是int 我自己想的如果把d定义为unsigned 结果会是什么样结果出来是负的,就遇到问题了 。好吧我在网上查查资料吧。
2012-07-24 15:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
提示一下,撇开前面的变量定义,你看看下面的语句输出什么:
printf("%u\n", -1);
printf("%d\n", -1);
注意:两次printf()都是使用同一个数!

授人以渔,不授人以鱼。
2012-07-24 15:07
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
哈哈...我知道是什么玩意了...
printf的非安全编码

既然版主不说,就留给版主给各位解答吧

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2012-07-24 15:14
starzq00123
Rank: 1
等 级:新手上路
帖 子:20
专家分:3
注 册:2012-7-20
收藏
得分:0 
我好像了解了 是printf 输出的格式我给的是%d整型的 没有规定没符号(应该是%u)对吧。
对于printf %d %u %f 输出格式的部分现在还不是分的很清 慢慢学吧!
2012-07-24 15:14
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
原来如此,受%d还是%u影响

The quieter you become, the more you can hear
2012-07-24 15:17
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
对的,问题本质就是:C语言的数据是由约定来解释的,这是C面向底层的原因。同样的一个二进制编码,被理解成什么,其实不是语言本身规定的,而是程序员自己决定的,这点是C语言与其他编程语言区别很大的一个特性。其实你一开始就学过,对ASCII字符'A',它的编码是65,在程序的机器码中,这就是一个十进制整数65,当你决定要把它解释成字符并命令它输出时,就应该使用printf("%c", 65),这等于告诉printf()函数,“我要把整数65解释成字符,你替我把对应的字符打印出来”,而如果你不要字符,也可以这样printf("%d", 'A'),这时,输出的是65(正如前面告诉你'A'实际上就是以65储存的)。C++沿袭了C的这种char等效于int的特性,是迫不得已,但在其他的高级编程语言中,都力戒这种语法的,即使在机器内部确实'A'=65,但在语言代码中坚决不允许你写出char x = 65这样的东西,这样规定,都是有深意的。

所以,在C语言中,不要被自己声明的数据类型弄混。你完全可以定义unsigned int x = -1,但-1在计算机中无论你声明x是signed int还是unsigned int,它都是0xffffffff(对32位整数来说),在运算中,需要程序员自己警惕到底使用的是什么!最典型的陷阱,就是for (unsigned int i = 10; i >= 0; --i)这样的循环语句,此时变量i被编译器解释为无符号整数,永远是i>=0的,这是一个死循环,因为当--i到i=0,再继续--i时,你以为是-1,但实际上机器认为那是0xffffffff,是一个极大的正整数。

事实上,不是所有语言都认可unsigned这样的无符号数据类型,有些语言是不承认这种数据的,原因也在这里。在C编程规范中,也劝告程序员尽量使用常规int类型,这才是保证程序可移植性的编码。因此,说C语言程序的可移植性强,不要轻信,除非你确实遵守规则,一旦培养了坏习惯,优势也变劣势。

[ 本帖最后由 TonyDeng 于 2012-7-24 15:41 编辑 ]

授人以渔,不授人以鱼。
2012-07-24 15:36
快速回复:关于unsigned int的 问题
数据加载中...
 
   



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

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