C 程序的输出 |第 55 组(移位运算符)
先决条件:移位运算符
Q.1这个程序的输出是什么?
#include
int main()
{
unsigned int i = 0x80;
printf("%d ", i << 1);
return 0;
}
选项
一)0
256
c) 100
d) 80
ans :- b
解释:- 我们知道 0x 是数字的十六进制表示,所以 80 转换为十进制是 128 二进制(10000000),它的左移 1 所以它是(100000000)等于 256。
Q.2这个程序的输出是什么?
#include
int main()
{
unsigned int a = 0xffff;
unsigned int k = ~a;
printf("%d %d\n", a, k);
return 0;
}
选项
a) 65535 -65536
b) -65535 65535
c) 65535 65535
d) -65535 -65535
ans :- a
说明:- 此代码 0x 是数字的十六进制表示,因此 ffff 十六进制转换为十进制 65535 并存储在 a. -65535 的否定存储在 k 中。 k 是一个无符号整数,但它有一个负值。当 k 被打印时,格式说明符是 %d,它代表有符号整数,因此 -65536 被打印为 k 的值。如果 k 的格式说明符是 %u,则打印的值是 4294901760。
Q.3这个程序的输出是什么?
#include
int main()
{
unsigned int a = -1;
unsigned int b = 4;
printf("%d\n", a << b);
return 0;
}
选项
一)-1
b) 16
c) 8
d) -16
ans :- d
解释:- 这里的整数只是左移 4 位并打印,所以它是 -16。
Q.4这个程序的输出是什么?
#include
int main()
{
unsigned int m = 32;
printf("%d %d", m >> 1, ~m);
return 0;
}
选项
一) 16 5
b) 64 -32
c) 16 33
d) 16 -33
ans :- d
解释:- 这个程序 32 是(10000),我们知道二进制系统中的负数包含一个补码,所以这里取一个数字的补码,只打印这个数字,所以 32 的负数是 -33。
Q.5这个程序的输出是什么?
#include
int main()
{
unsigned int a = -1;
unsigned int b = 15;
printf("%d, ", a << 1);
printf("%d\n", b >> 1);
return 0;
}
选项
a) -2, 7
b) 2, 8
c) -1, 15
d) -2, 15
ans :- a
解释:- 这里 -1 binary(0001) 如果左移 1 所以它是 -2(0010) 和 15 binary(1111) 是右移 1 所以它是 (0111) 所以值 7。