首页 > 试题广场 >

下列C程序执行后c输出结果为( )

[单选题]
下列C程序执行后c输出结果为( )(32位)
#include<stdio.h>
#include<stdlib.h>
void main()
{
  int a = -3;
  unsigned int b = 2;
  long c = a + b;
  printf("%ld\n", c);
}
  • -1
  • 4294967295
  • 0x7FFFFFFF
  • 0xFFFFFFFF
使用VS编译后的结果
发表于 2016-04-08 13:00:26 回复(0)
个人理解:
(1)如果是负数,那么在计算机保存时应该转为补码,负数的补码为:除符号位以外,取反后,再加一
(2)正数的话,保存时不变
由于在32位系统中,int , unsigned int, long的大小均为4字节
int a = -3, 
原码:1000 0000 0000 0000 0000 0000 0000 0011
反码:1111 1111 1111 1111 1111 1111 1111 1100
补码:1111 1111 1111 1111 1111 1111 1111 1101
unsigned intb = 2;
原码:0000 0000 0000 0000 0000 0000 0000 0010
反码:0000 0000 0000 0000 0000 0000 0000 0010
补码:0000 0000 0000 0000 0000 0000 0000 0010
那么,a+b应该是补码的运算,即:
1111 1111 1111 1111 1111 1111 1111 1101
+
0000 0000 0000 0000 0000 0000 0000 0010
=
1111 1111 1111 1111 1111 1111 1111 1111 
所以相加以后,保存的应该是:0xffffffff,
但是,由于要显示出来,即最后的打印,那么我们应该求出0xffffffff是什么数字保存在内存中的,
因此,应该对补码求反,很容易的得出,应该是除符号位以外减一取反
原码:1111 1111 1111 1111 1111 1111 1111 1111
减一:1111 1111 1111 1111 1111 1111 1111 1110
取反:1000 0000 0000 0000 0000 0000 0000 0001
那么显示的应该是-1
发表于 2016-04-23 21:30:44 回复(7)
无符号和有符号整数进行运算时,有符号整数会被提升为无符号整数。
-3对应的二进制表示是0xfffffffd,和2相加表示0xffffffff。
输出结果取决于long是32位,还是64位。这个取决于编译器和机器。
long是有符号的整型。
如果是32位,0xfffffff在补码表示法(最高位是负数位)下是等于-1.
如果是64位,0xfffffff是属于long的正整数范围(负数位在第64位),等于4294967295。
(如果你的编译出来是32位的long,你可以用longlong测试一下就能得到这个数。因为 long long 无论在32位机器或者64位机器都是占用8个字节64位)
----------------------------------------------------------------------------------------------
补充一下,这个题目感觉很坑,CD我觉得是不能选的,很多面试题其实都不严谨,不必过于纠结,也建议不要盲目相信答案。
编辑于 2016-09-05 17:46:12 回复(15)
LLJ头像 LLJ
gcc编译之后,运行结果是-1.
问题问的是输出结果,ld表示长整型,按十进制输出就是-1.
发表于 2016-04-08 10:41:42 回复(1)
答案:A.-1
计算机里面的代码是以二进制补码的形式存储的,在进行负数需要注意一下,正数的补码是它本身,负数的补码=取反+ 1;a = -3是有符号数,首先3的二进制表示为0000 0000 0000 0000 0000 0000 0000 0011 取反后:1111 1111 1111 1111 1111 1111 1111 1100 加1后:1111 1111 1111 1111 1111 1111 1111 1101 ;b = 2是无符号数:0000 0000 0000 0000 0000 0000 0000 0010 ;a + b 之后得到:1111 1111 1111 1111 1111 1111 1111 1111 即0xFFFFFFFF, 因为计算机存的是补码,所以显示出来要转化出来也是取反加一。最终答案:-1

有符号数和无符号数的区别:
有符号数和无符号数进行比较运算时候(==, <, > <=, >= )有符号数会转化成无符号数(即底层的补码不变,但是比较数从有符号变无符号数)

发表于 2016-04-23 08:30:26 回复(0)
发表于 2017-06-25 16:29:47 回复(0)
(1)如果是负数,那么在计算机保存时应该转为补码,负数的补码为:除符号位以外,取反后,再加一 (2)正数的话,保存时不变 由于在32位系统中,int , unsigned int, long的大小均为4字节 int a = -3,  原码:1000 0000 0000 0000 0000 0000 0000 0011 反码:1111 1111 1111 1111 1111 1111 1111 1100 补码:1111 1111 1111 1111 1111 1111 1111 1101 unsigned intb = 2; 原码:0000 0000 0000 0000 0000 0000 0000 0010 反码:0000 0000 0000 0000 0000 0000 0000 0010 补码:0000 0000 0000 0000 0000 0000 0000 0010 那么,a+b应该是补码的运算,即: 1111 1111 1111 1111 1111 1111 1111 1101 + 0000 0000 0000 0000 0000 0000 0000 0010 = 1111 1111 1111 1111 1111 1111 1111 1111  所以相加以后,保存的应该是:0xffffffff, 但是,由于要显示出来,即最后的打印,那么我们应该求出0xffffffff是什么数字保存在内存中的, 因此,应该对补码求反,很容易的得出,应该是除符号位以外减一取反 即 原码:1111 1111 1111 1111 1111 1111 1111 1111 减一:1111 1111 1111 1111 1111 1111 1111 1110 取反:1000 0000 0000 0000 0000 0000 0000 0001 那么显示的应该是-1
发表于 2017-09-22 11:08:49 回复(0)
unsigned intb = -1;
cout<<b<<endl;
为4294967295

-1 的补码表示为:0xFFFFFFFF

编辑于 2016-04-07 16:01:13 回复(0)
在c++下,结果取决于long的位数
如果long的字节数位4,则值等于-1
如果为8,则选B
发表于 2020-04-02 13:13:03 回复(0)
长整型是可以有负数的
发表于 2020-03-25 22:01:44 回复(0)
-3+2=-1,就是这么简单粗暴🤔
发表于 2018-11-27 21:16:11 回复(0)
无符号和有符号整数进行运算时,有符号整数会被提升为无符号整数。
发表于 2018-06-07 11:02:39 回复(0)
vs2013 运行结果是 -1
发表于 2016-04-07 13:11:51 回复(1)
在Mac下编译printf ("%ld", -1);和printf ("%ld", (int)-1);都输出4294967295,而printf ("%ld", (long)-1);输出-1,说明输出时先对不足位数的进行高位补零,然后再按相应的格式进行输出
发表于 2019-03-20 14:14:17 回复(0)
这一题主要考察强制类型转换的问题:小类型会向大类型转换 即由 int 到unsigned int转换。
 -3 的二进制码可以由 3的源码求补码获得
3的二进制表示为 :                               0000 0000 0000 0000 0000 0000 0000 0011
按位取反 再加1 求得 -3 的二进制表示:1111 1111 1111 1111 1111 1111 1111 1101
 则 a+b 的二进制表示 为     :                1111 1111 1111 1111 1111 1111 1111 1111 即 0xFFFFFFFF;
由于c 是有符号的long 类型     0xFFFFFFFF 的十进制值就是 -1;




发表于 2018-04-27 15:54:48 回复(0)
明明写着结果输出是多少,然而并没有想到B和D也要选?果然神题?!
发表于 2016-09-05 15:07:48 回复(0)
个人理解。答案显示是ABD。B的答案是无符号类型的-1,A的答案是长整形的输出,D答案是-1在内存中的存储。
发表于 2016-04-08 15:33:10 回复(0)
赋值的时候发生数据类型的转换,int->long;u->long 
发表于 2023-03-22 21:46:04 回复(0)
以%ld的视角看计算结果0Xffff ffff就是-1。
发表于 2022-08-31 23:10:29 回复(0)
结果是全F 输出是-1
发表于 2022-03-14 09:13:57 回复(0)