同样的数据,为什么显示结果不一样?

sinaicew 2013-09-01 05:23:45

#include <stdio.h>
void main(){

signed char a = 0xe0;
unsigned int b = a;
unsigned int c = 0xe0;
unsigned char d = a;
printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d);
}

//output:a=-32,b=-32,c=224,d=224
a,b,c,d存储的应该都是补码形式1110 0000,但为何printf("%d")打印出来的只却不一样。尤其是

unsigned int b = a;
unsigned int c = 0xe0;

这两句,为什么一个是-32,一个是224.难道存储的内容不一样吗?
对这块儿有点晕,希望能给个详细解答,谢谢
...全文
598 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
清竹小雨 2013-09-20
  • 打赏
  • 举报
回复
首先来说下零扩展和符号扩展两个概念: zero extention:将无符号数转换成更大的无符号数据类型,我们将简单地在扩展位上添加零,这个操作叫zero extension. sign extention:将二次补码的数转换成更大的二次补码的数据类型,我们将该数的最高位复制到扩展位上,这个操作叫sign extention. 还有另两个规则: 1.在C语言里算术操作的时候,有一个操作数是有符号,而其它操作数是无符号数时,该有符号操作数隐式地转换成无符号数再进行运算。 2.在C语言里算术操作里,当操作数是不同的数据类型时,那么低精度的数据类型会提升为高精度的数据类型,再运算。 楼主的代码假设在32bit的机器上运行的。 unsigned int b = a; a提升为signed int进行符号扩展.其值为0xff ff ff e0,因此b的位模式为0xff ff ff e0; unsigned char d = a; a转换为unsigned char(0x e0),那么d的位模式为0xe0; 因为参数是%d,会强制转换成signed int类型,将以补码形式表示: a(0xff ff ff e0)=-32 (符号扩展) b(0xff ff ff e0)=-32 c(0x00 00 00 e0)=224 (零扩展) d(0x00 00 00 e0)=224 (零扩展)
  • 打赏
  • 举报
回复
unsigned int b = a;a是一个有符号字符型,一个字节,最高位是符号位,在这里是一个负数。 b是一个无符号整型,负数传递,字节扩充,所以 b的值为0xffffffe0,这是一个很大的值 ,注意最后一个f的最高位为1,在b这里代表的不是符号,然而在 printf("a=%d,b=%d,c=%d,d=%d",a,b,c,d); %d,在读取b的值是按有符号值来读的4个字节,所以 %d里面 0xffffffe0里面的最高位表示符号位。 而c的话是一个无符号整型,所以它的值为0x000000e0。 b和c的值当然不一样,楼主将第二个%d换成%u试试。
熊熊大叔 2013-09-07
  • 打赏
  • 举报
回复
a是0xe0 signed char类型 b是0xffffffe0 unsigned int类型 d是0xe0 unsigned char类型 打印时格式都是%d, 会强制转换成signed int类型, 转换结果就如顶楼所示。
To_be_sky 2013-09-05
  • 打赏
  • 举报
回复
赋值这里面有隐式转换! 还有就是Printf中的输出类型要对应啊!
nextseconds 2013-09-05
  • 打赏
  • 举报
回复
额。首先肯定要求格式得对应输出,否则输出结果确实难以预测!
zczqwd 2013-09-02
  • 打赏
  • 举报
回复
查看内存,你会发现其实二进制表示并不相同,你要知道,signed char到int,并不一定补零。printf函数对于char和短整型参数,提升为int类型将相应数据压入栈中。a与b,,压入栈中的实际为-32的int型二进制表示,即ffffffe0(对于int为32位的机器),而后两个为224的二进制表示000000e0,所以%d解析出不同结果很正常。
sinaicew 2013-09-02
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
printf("%该参数按恐龙的格式解析",CSDN论坛上的sinaicew); //帖主认为这句的输出应该是什么呢?
没尾巴龙
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
printf("%该参数按恐龙的格式解析",CSDN论坛上的sinaicew); //帖主认为这句的输出应该是什么呢?
sinaicew 2013-09-02
  • 打赏
  • 举报
回复
引用 7 楼 max_min_ 的回复:
对应的数据类型,使用printf函数的时候用对应的输出类型嘛 何必为难自己呢!
恩,但主要是为了更好的理解招聘时哪些恶心人的题.....
max_min_ 2013-09-02
  • 打赏
  • 举报
回复
引用 8 楼 sinaicew 的回复:
[quote=引用 7 楼 max_min_ 的回复:] 对应的数据类型,使用printf函数的时候用对应的输出类型嘛 何必为难自己呢!
恩,但主要是为了更好的理解招聘时哪些恶心人的题.....[/quote] printf函数是对应格式输出的,格式不对,输出结果不可预测的!可能性比较多! 当然可能符合某种语法!
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c
max_min_ 2013-09-01
  • 打赏
  • 举报
回复
对应的数据类型,使用printf函数的时候用对应的输出类型嘛 何必为难自己呢!
发型不乱hy 2013-09-01
  • 打赏
  • 举报
回复
一个是有符号 一个是没符号
AnYidan 2013-09-01
  • 打赏
  • 举报
回复
c 语言的隐式转换是混乱源之一 printf 输出时作了integral promotion
relaxisland 2013-09-01
  • 打赏
  • 举报
回复
2楼说的,但不是很准确 signed char a = 0xe0; ----》内部保存为 1110 0000 也就是 0xE0 unsigned int b = a; a计算是,自动升级为int、符号不变, 也就是1111 1111 1110 0000, 即0xFFFFFFE0 然后赋值给 b,因为并没有超过b的范围, 也就是直接不做任何变更赋值过去。
hsadC 2013-09-01
  • 打赏
  • 举报
回复
b是无符号的,但是在输出的时候是%d,转换为了有符号的整形,1110 0000的值为-32 。 d因为在转化为有符号的整形时,在高位填充了3个字节所以输出为224.
碼上道 2013-09-01
  • 打赏
  • 举报
回复
会不是会堆栈内存对齐影响的?
zhaokai115 2013-09-01
  • 打赏
  • 举报
回复
符号扩展吧,C语言里char内部是用int保存的,所以a,b的内部表示是0xFFFFFFFE,c,d是0x000000FE。
数据分析,数据科学及AI算法是当前最热门的职业。这些职业有着共同的特点:面向数字的,针对编程的以及采取分析手段的。 这些当代热点特性使得在就业市场上对以上职位需求激增也就不足为奇了。但是,市场上提供这方面的大型综合的培训课程是有限,如果说有,大多是知识范围狭窄且非综合性的,而且大多培训都缺乏方法论与实务结合。一般的情况是讲师讲述某种语言的一堆代码,学生听完后甚至连使用方法及代码的前提都不清楚,更别提实际应用场景了。这里,掌握一门数据分析软件本身没错,但仅通过单一的编程培训很难获得聘用为数据分析师或数据科学家所需的技能。那我的解决方案是什么呢?首先,我把所有数据分析中的典型问题都归类总结出来,再结合相应的实际问题,数据以及案例,同时采用世界上最流行的两种数据分析软件:PYTHON 和 SAS去解决这些问题,并将这些解决方法传授给学生。学生在完成培训后更重要的收获是知道每一问题从产生直至解决的前因后果和应用场景,这是因为我在每一课程章节最前都会交代方法论,知识要点及应用场合。SAS和PYTHON可以一起学吗?当然可以。因为我就是这样做到的。具体步骤是,我在课程当中安排了一系列主题,然后使用两种编程语言解决同样的问题。我总结出这样做的好处是边学习边比较,最后在不知不觉当中掌握了两门语言的精华和数据分析的通用方法或模式。过程虽有点长,但十分有趣。最后,为了巩固已学的知识和技能,我还专门安排了针对PYTHON 和 SAS的中小型项目及详细代码讲解。另外,课程当中使用的全部编程代码及数据文件都将免费地提供给注册的学生。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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