黑马程序员技术交流社区

标题: 一个C语言小问题 [打印本页]

作者: craneteng    时间: 2015-11-5 11:25
标题: 一个C语言小问题

#include <stdio.h>
main()
{
        unsigned int a;
        a=-5;
        printf("%d\n",a);
}
为什么运行结果是-5
把-5赋值给无符号整形a时  格式不是会自动转换吗?应该转成5啊?换为%u之后运行结果是随机数。。
作者: 亚东    时间: 2015-11-5 11:30
我来听讲!
作者: heiHorse    时间: 2015-11-5 12:53
围观,围观
作者: toveyloves    时间: 2015-11-5 13:00
程序就是这样咯!
作者: liuchuan_alex    时间: 2015-11-5 19:48
编译难道不会报错码?
作者:   张恒宇    时间: 2015-11-5 20:26
%d打印的是有符号的。。。。%u打印的无符号的
作者: Marlong    时间: 2015-11-7 22:53
这个问题让我想起了之前做的一个题,先说说你提出的问题把
虽然你定义了a为无符号类型,却给a赋值了-5
而你在输出函数中对应a的转换说明符是%d,意为把输出解释成一个有符号十进制整数
故而你的输出值还是-5
至于改写成%u后,运行的结果不是随机数
无符号类型在我的电脑上的取值范围是0~4294967295,数值-5超出取值范围
数据如果超出了整型数据表示范围,则用比当前数据类型大的最小数据类型来表示
就相当于 输出 4294967295-5,得到值为 429496721

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


作者: 李凯666    时间: 2015-11-8 14:21
这个应该和编译器有关系吧
作者: 649685603    时间: 2015-11-8 14:27
我是来听讲的
作者: 正在输入中...    时间: 2015-11-8 14:33
这个理解起来很简单,a就是一块内存,内存里面存储的数据是一样的,关键看你取出来怎么表示成什么意思,你把取出来 按照%d的形式展示出来,如果你按照%u的形式打印出来 就是-5啦。
作者: Morning_jcg    时间: 2015-11-8 14:57
你通过%d输出自然是带符号的啦,你用%u试一下。其实你这个变量定义的时候是什么类型和它怎么储存并没有太大关系,int a,一样可以%c来输出,输出的是asc码值为a的字符,主要是看机器怎么去理解。
作者: amoshaxiangp    时间: 2015-11-8 15:14
我是来围观奇迹的。。。
作者: black747521    时间: 2015-11-8 21:25
你要理解机器存储数据的方式和原理,就清楚怎么回事了,楼上的说的都挺清楚的
作者: 大雕会飞    时间: 2015-11-8 22:11
定义什么就用对应的去输出啊。
作者: 夏夏天阳    时间: 2015-11-8 23:01
因为无符号和有符号整数在内存中都是用补码形式存储的。
用%u打印无符号类型。
用%d就会把unsigned 转换成signed再输出
作者: 吴永涛    时间: 2015-11-8 23:41
果然有回会很全的!
作者: gbl19920226    时间: 2015-11-9 10:32
你可以记一下这个口诀:C语言不看怎么存,只看怎么取!
作者: 伍陶陶    时间: 2015-11-9 13:11
二楼不错!!!但是还是不太懂,希望有人讲的更详细一点。
作者: 谁在放荡    时间: 2015-11-9 13:47
学习了,有用




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2