各位请进,关于类型自动转换

slwj 2011-08-06 07:57:40
各位好,关于C语言的类型自动转换,一道面试题目如下:
[Quote=引用]
void foo(void)

{

unsigned int a = 6;

int b = -20;

(a+b > 6) puts("> 6") : puts("<= 6");

}

这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是“>6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。
[/Quote]

上面提到:是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。

不过我在MinGW下编程做了下测试,代码以及输出结果如下,与上述的说法正好相反:
[Quote=源代码及其输出]
int main()
{
int a=-10;
unsigned int b=6;
unsigned int d=a+b;

printf("a=%d\n", a);
printf("b=%d\n", b);

printf("a+b=%d\n", d);
printf("a+b=%4x\n", d);

}

输出如下:
a=-10
b=6
a+b=-4 //如果所有的操作数都自动转换为无符号类型,这里应该是fffffffc
a+b=fffffffc

[/Quote]
,请各位不吝赐教,多谢了!
...全文
80 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2011-08-06
  • 打赏
  • 举报
回复
楼主还是用用c++里的cout来输出吧。
slwj 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 babilife 的回复:]

楼主须知,无符号数和有符号数在计算机中的存储方式就明白了
[/Quote]

这句话不太理解了,从存贮方式如何得知是无符号数还是有符号数?须知,关于存贮的实质如下:
[Quote]
由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。
[/Quote]
McMong 2011-08-06
  • 打赏
  • 举报
回复
学习~
AnYidan 2011-08-06
  • 打赏
  • 举报
回复
If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion.
至善者善之敌 2011-08-06
  • 打赏
  • 举报
回复
楼主须知,无符号数和有符号数在计算机中的存储方式就明白了
pathuang68 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pathuang68 的回复:]

没有问题,是你的格式符号有问题:
printf("a+b=%d\n", d);
应该是
printf("a+b=%ud\n", d);
[/Quote]
要把d删掉滴。这样:
printf("a+b=%u\n", d);
pathuang68 2011-08-06
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int main()
{
int a=-10;
unsigned int b=6;
unsigned int d=a+b;

printf("a=%d\n", a);
printf("b=%d\n", b);

// 在C++中可以用typeid来查看一个对象的数据类型:
cout << typeid(a + b).name() << endl; // 输出unsigned int
cout << typeid(d).name() << endl; // 输出unsigned int
cout << (a+b) << endl; // 输出4294967292
cout << d << endl; // 输出4294967292
}
pathuang68 2011-08-06
  • 打赏
  • 举报
回复
没有问题,是你的格式符号有问题:
printf("a+b=%d\n", d);
应该是
printf("a+b=%ud\n", d);
机智的呆呆 2011-08-06
  • 打赏
  • 举报
回复
lz你查查printf 中%d的意义的就知道原因了
www_adintr_com 2011-08-06
  • 打赏
  • 举报
回复
那是因为你 printf 里的 %d 又把那个无符号数转换成有符号数来输出了.

69,371

社区成员

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

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