首页 > 试题广场 >

下面代码输出什么?

[填空题]
下面代码输出什么
#include<stdio.h>
int main( )
{
    unsigned int a = 6;
    int b = -20;
    (a + b > 6) ? printf(">6") : printf("<=6");
    return 0;
}
输出结果是1
推荐
答案 >6

解释:a+b ,b需要转换成unsigned
编辑于 2015-01-27 15:22:45 回复(3)
在内存中a的存储表示:(6的原码)
0000 0000  0000 0000  0000 0000  0000 0110
在内存中b的存储表示:(-20的补码)
1111 1111  1111 1111  1111 1111  1110 1100
两者相加:
       1111 1111  1111 1111  1111 1111  1110 1100
    + 0000 0000  0000 0000  0000 0000  0000 0110
       1111 1111  1111 1111  1111 1111  1111 0010
结果为转换十进制为:4294967282
验证:
int main()
{
unsigned int a = 6;
int b = -20;
(a + b > 4294967282) ? printf(">4294967282") : printf("<=4294967282");
printf("\n");
(a + b > 4294967281) ? printf(">4294967281") : printf("<=4294967281");
return 0;
}
结果:
<=4294967282
>4294967281
验证表明这样理解是没错的

编辑于 2015-11-08 01:10:36 回复(3)
整形(int)和无符号整形相加时,int先转化为unsigned int,b在内存中以-20的二进制补码形式存储,执行a+b时,b要以unsigned int的形式读取内存中的数据,即将-20的补码按照unsigned int的形式理解读取(4,294,967,276),再加上a(6)-----》4,294,967,282,大于6
发表于 2015-09-02 22:01:02 回复(1)
发表于 2016-10-04 16:24:48 回复(0)
C++primer第四版说,C++允许将负数赋给unsigned类型。所以把负值赋给unsignede 对象的时候,其结果是该负数对该类型的取值个数求模后的值。所以本题a+b,将b转换为unsigned , =-20/2的32次方=
发表于 2015-07-27 17:35:23 回复(1)

这样都会错
发表于 2015-10-01 12:13:21 回复(5)
道理我都懂, 但是评判的标准我没懂


发表于 2021-07-09 10:16:54 回复(0)
计算机转换unsigned int -20 为整数4294967276,将-20补全为32位,再变成补码的形式就是前面的数
发表于 2015-09-09 18:08:56 回复(0)
有符号数与无符号数相加时,有符号数会自动转化为无符号数,所以本题a+b会成为一个很大的数,所以a+b>6
发表于 2015-06-18 10:47:30 回复(0)
a + b做运算时,要将b转换为无符号数,结果为无符号数,值大于6。

输出:>6
发表于 2015-01-21 17:14:54 回复(0)
答:>6
程序的运算要求一致的数据类型,通常低类型向高类型转换。占内存字节数少的数据类型向占字节数多的类型转换以保证不损失精度。Int和unsigned int都是4字节,但是int有一个符号位,相当于数据位较少,向int型转换,所以导致a+b>6
发表于 2015-01-29 17:26:03 回复(1)
#include<stdio.h>
int main()
{
    unsigned int a = 6;
    int b = -20;
   
    a+b > 4294967282 ? printf("> 4294967282\n") : printf("<= 4294967282\n");
    a+b > 4294967281 ? printf("> 4294967281") : printf("<= 4294967281");

    return 0;
}
发表于 2023-09-11 13:24:04 回复(0)
#include <stdio.h>

int main()
{
 unsigned int a = 6;
 int b = -20;
 (a+b)>6?printf(">6\n"):printf("<6\n");
 return 0;


结果是  >6

为什么呢?这里涉及到了隐式转换的问题》》》》》

C在以下四种情况下会进行隐式转换:

       1、算术运算式中,低类型能够转换为高类型。
       2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
       3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
       4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。



1、算术运算的隐式转换

   

 算数运算中,首先有如下类型转换规则:
       1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。
       2、short型转换为int型(同属于整型) 。
       3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。
    其次,有下面的规则。

    当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作,转换规则是由低级向高级转换。转换规则如图所示;

当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。 

#include <stdio.h>
int main()
{
 unsigned int a = 6;
 int b = -20;
 (a>b)?printf(">\n"):printf("<\n");
 return 0;

}

结果:<

因为在C语言中,有符号数与无符号数同时存在的操作,有符号数会隐式转换成无符号数,结果b会变成一个很大的无符号数。

减法和乘法的运算结果类似。

但如果是signed int 型数据与立即数操作时,结果仍是signed int 型

#include <stdio.h>

int main()
{
 int b = -130;
 printf("%d\n",b+30 );
 return 0;
}

结果:-100;



而对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数跟无符号数之间转化的问题了。

最后有个疑问:

#include <stdio.h>
int main()
{
 unsigned int i = 3;
 printf("%d\n",i* -1);
 return 0;

}结果是-3;

在c++中:

#include <iostream>
using namespace std;
int main()
{
 unsigned int i = 3;
 cout << i* -1 << endl;
 return 0;
}

在表达式i*-1中,i是unsigned int型,-1是int型(常量整数的类型同enum),可以知道-1必须转换为unsigned int型,即0xffffffff,十进制的4294967295,然后再与i相乘,即4294967295*3,如果不考虑溢出的话,结果是12884901885,十六进制0x2FFFFFFFD,由于unsigned int只能表示32位,因此结果是0xfffffffd,即4294967293
发表于 2021-08-03 15:55:36 回复(1)
<p>存在强制类型转换</p>
发表于 2020-07-09 16:15:00 回复(0)
有符号 
无符号
原码   补码   反码  
符号位不变  按位取反  
发表于 2019-10-15 16:14:06 回复(0)
发表于 2019-09-25 09:45:59 回复(0)
发表于 2017-07-10 14:02:11 回复(1)
涉及到类型提升:
int + unsigned int 会自动将int 转换成unsigned int 类型,那么-20就会变成一个很大的无符号整数,结果自然是 ' > 6 '

类型自动转换的规则如下:
char、short ->  int -> unsigned int -> long -> double   <- float
                                                            
发表于 2017-07-08 11:31:13 回复(0)
int 和 unsigned int 相加时,int 会先被转换为unsigned int。
a + b = b + a = 4294967282 > 6 

发表于 2017-05-23 10:46:55 回复(0)
unsigned
发表于 2017-03-27 17:26:13 回复(0)
int 转换为 unsigned型,没溢出,所以结果必定大于6
发表于 2017-03-02 19:53:13 回复(0)