分析1
#include<iostream.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct AA
{
int b1:5;
int b2:2;
}AA;
void main()
{
AA aa;
char cc[100];
strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
memcpy(&aa,cc,sizeof(AA));
cout << aa.b1 <<endl;
cout << aa.b2 <<endl;
}
答案: -16 和1
首先sizeof(AA)的大小为4,b1 和b2 分别占5bit 和2bit.
经过strcpy 和memcpy 后,aa 的4 个字节所存放的值是:
0,1,2,3 的ASC 码,即00110000,00110001,00110010,00110011
所以,最后一步:显示的是这4个字节的前5位,和之后的2位
分别为:10000,和01
因为int 是有正负之分所以是-16 和1
ps:一个字节为8位,从右往左位数越来越高!
分析2:
struct bit
{ int a:3;
int b:2;
int c:3;
};
int main()
{
bit s;
char *c=(char*)&s;
cout<<sizeof(bit)<<endl;
*c=0x99;
cout << s.a <<endl <<s.b<<endl<<s.c<<endl;
int a=-1;
printf("%x",a);
return 0;
}
输出为什么是?
答案:
4
1
-1
-4
ffffffff
因为0x99 在内存中表示为100 11 001 , a = 001, b = 11, c = 100(在vc 环境中,一
般是由右到左进行分配的)
当c 为有符合数时, c = 100, 最高1 为表示c 为负数,负数在计算机用补码表示,所以c
= -4;同理
b = -1;
当c 为有符合数时, c = 100,即c = 4,同理b = 3
分析3:
#include <stdio.h>
int main(void) {
int **p;
int arr[100];
p = &arr;
return 0;
}
答案:搞错了,是指针类型不同,
int **p; //二级指针
&arr; //得到的是指向第一维为100 的数组的指针
应该这样写#include <stdio.h>
int main(void) {
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
}
分析4:
int a, b, c 请写函数实现C= a+b;不可以改变数据类型,如将c改为long int,关键是如何处理溢出问题
bool add(int a, int b, int *c)
{
*c = a+b;
return (a> 0 && b> 0 && (*c <a||*c <b)||(a<0 && b<0 && (*c> a || *c> b)));
}
两个int数相加,只有两个数的符号相同的时候才会溢出:
1,两个正数相加;
a> 0 && b> 0 就是判断两数都是正数;如果没有溢出,则和c必定大于a、b,反之溢出;
2,两负数相加;
a <0 && b <0 判断两数都是负数;如果没有溢出,则和c必定小于a、b,反之溢出;
综合起来就是:
return (a> 0 && b> 0 && (*c <a||*c <b) || (a <0 && b <0 && (*c> a || *c> b)));
分析5:
typedef union DATE{
int i;
char a[5];
char c;}DATE;
sizeof(DATE)=__6__
答案:6 虽然 char[5]需要5个字节,但是还是需要按照里面最大的字节(int)对齐的 所以为 6
分析 6:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是?
答 、结果是:___52____。DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20
data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
所以结果是 20 + 32 = 52.
当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
分析7:
-1,2,7,28,,126请问28和126中间那个数是什么?为什么?
答 、应该是4^3-1=63
规律是n^3-1(当n为偶数0,2,4)
n^3+1(当n为奇数1,3,5)