分析一下

 分析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)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值