A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© craneteng 中级黑马   /  2015-11-5 11:25  /  1722 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


#include <stdio.h>
main()
{
        unsigned int a;
        a=-5;
        printf("%d\n",a);
}
为什么运行结果是-5
把-5赋值给无符号整形a时  格式不是会自动转换吗?应该转成5啊?换为%u之后运行结果是随机数。。

18 个回复

倒序浏览
我来听讲!
回复 使用道具 举报
heiHorse 来自手机 中级黑马 2015-11-5 12:53:41
藤椅
围观,围观
回复 使用道具 举报
toveyloves 来自手机 中级黑马 2015-11-5 13:00:01
板凳
程序就是这样咯!
回复 使用道具 举报
编译难道不会报错码?
回复 使用道具 举报
%d打印的是有符号的。。。。%u打印的无符号的
回复 使用道具 举报
这个问题让我想起了之前做的一个题,先说说你提出的问题把
虽然你定义了a为无符号类型,却给a赋值了-5
而你在输出函数中对应a的转换说明符是%d,意为把输出解释成一个有符号十进制整数
故而你的输出值还是-5
至于改写成%u后,运行的结果不是随机数
无符号类型在我的电脑上的取值范围是0~4294967295,数值-5超出取值范围
数据如果超出了整型数据表示范围,则用比当前数据类型大的最小数据类型来表示
就相当于 输出 4294967295-5,得到值为 429496721

留个思考题,要求输入一个ASCII码值(如66),然后输出相应的字符

回复 使用道具 举报 1 0
这个应该和编译器有关系吧
回复 使用道具 举报
我是来听讲的
回复 使用道具 举报
这个理解起来很简单,a就是一块内存,内存里面存储的数据是一样的,关键看你取出来怎么表示成什么意思,你把取出来 按照%d的形式展示出来,如果你按照%u的形式打印出来 就是-5啦。
回复 使用道具 举报
你通过%d输出自然是带符号的啦,你用%u试一下。其实你这个变量定义的时候是什么类型和它怎么储存并没有太大关系,int a,一样可以%c来输出,输出的是asc码值为a的字符,主要是看机器怎么去理解。
回复 使用道具 举报
我是来围观奇迹的。。。
回复 使用道具 举报
你要理解机器存储数据的方式和原理,就清楚怎么回事了,楼上的说的都挺清楚的
回复 使用道具 举报
定义什么就用对应的去输出啊。
回复 使用道具 举报
因为无符号和有符号整数在内存中都是用补码形式存储的。
用%u打印无符号类型。
用%d就会把unsigned 转换成signed再输出
回复 使用道具 举报
果然有回会很全的!
回复 使用道具 举报
你可以记一下这个口诀:C语言不看怎么存,只看怎么取!
回复 使用道具 举报
二楼不错!!!但是还是不太懂,希望有人讲的更详细一点。
回复 使用道具 举报
谁在放荡 来自手机 中级黑马 2015-11-9 13:47:32
19#
学习了,有用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马