C语言之面试题(一)

位扩展问题:

当不同的数据类型进行运算时,会发生强制或者隐式的类型转换。通常时低精度的扩展到高精度。

char a,b,c;
a=1;
b=127;
c=a+b
print("%d",strlen(a+b));//打印出来为4
print("%d",strlen(c)); //打印出来为1

虽然a和b都是一字节,但是为了进行运算,先统一转换为int字节,生成c后再转换char。所以strlen(a+b)为4个字节。 

typedef struct
{
int a:2;
int b:2; 
int c:1;
}test;
/*
  信息存储时,并不需要占用一个完整的字节,有时只需几个或一个二进制位。为了节省存储空间,C语言提供
了一种数据结构,称为"位域"或"位段"。因为a占两个位,b占两个位,c占一个位。int是有符号整型,它是有符号位的,也就是a和b,实际上只能存一个二进制位,另外一个是它的符号位。所以 a:01 表示为1
b:11 表示-1. c只有一位,具体值是什么,取决于编译器。1,如果看作符号位,就是-1;没有符号位就是1.
*/
int main()
{
  test test1;
  test1.a=1
  test1.b=3;
  test1.c=1;
  cout <<test1.a <<endl; //print 1
  cout <<test1.b <<endl; //      -1
  cout <<test1.c <<endl; //      1
  return 0;
}

 对绝对地址0x100000赋值,并且程序跳到0x100000执行。

/*对绝对地址0x100000赋值*/
*(unsigned int*)0x100000=1234;
/*程序跳到0x100000执行*/
/*函数指针*/
typedef void Voditest();
(*(Voidtest*)0x100000)();
//*((void(*)())0x100000)()
//void(*)()==>函数指针 *((函数指针)地址)()

char c=128;
printf("c=%u\n",c);
//c=-128; 输出的是int,最高位是1,是负数。取反加一,输出是-128.

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/81091097