1.32位机上根据下面的代码,问哪些说法是正确的?()
signed char a = 0xe0
unsigned int b = a;
unsigned char c = a;
A. a>0 && c>0 为真
B.a == c 为真
C.b的十六进制表示是:0xfffffe0
D.上面都不对
signed代表有符号的,也就是第一个位代表正负,剩余的代表大小,例如:signed int大小区间为-128-127
unsigned代表无符号的,所有的位都是大小,没有负数,例如unsigned int大小区间为:0-255
默认为signed
A选项:0xe0=14*16=224>0,虽然说a和c在不考虑符号的情况下是相等的,都大于0,但是在计算机实际执行的时候,a=-32,c=224。因为他们一个是有符号的,另一个是无符号的,所以不相等,也并不都大于0。A错误。
a为什么是负数?
将a=0xe0转换成二进制的时候是11100000,有符号的数在用二进制表示的时候,它的最高位是符号位,最高位是1,代表是负号。
B选项:a和c,一个是有符号的,另一个是无符号的,显然不相等。B错误。
C选项:正确。
思考:这道题表面上考c,其实是考计算机组成原理
2.下面哪些选项能编译通过?()
int i;
char a[10];
string f();
string g(string & str);
A.if(!!i)(f();)
B.g(f());
C.a=a+1;
D.g("abc");
采用排除法:
首先C肯定不能通过。
D选项:"abc"看似是一个string类型,其实是const char*,编译不能通过。
B选项:f()也不是string类型,是const char*,编译不能通过。
答案:A