Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209978
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 798
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-14 14:54
文章分类

全部博文(87)

文章存档

2015年(87)

我的朋友

分类: C/C++

2015-10-08 18:05:52

CPU(32位小字节处理器)
1.

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char *p="abcdefgh", *r;
  5.     long *q;
  6.     q=(long *)p;
  7.     q++;
  8.     r=(char *)q;
  9.     printf("%s\n", r);

  10.     return 0;
  11. }
输出:efgh
解析:
16位系统:long是4字节,int是2字节 ;32位系统:long是4字节,int是4字节 ;64位系统:long是8字节,int是4字节

2.
struct tagABC
{
    char cB;
    short sC;
    char cD;
     long lA;
}*pAbc;

pAbc=0x100000; 
那么pAbc+0x100=0x100C00;(ULONG)pAbc+0x100=0x100400; (ULONG*)pAbc+0x100=0x100400;(char *)pAbc+0x100=0x100400;
解析:
系统是32位的,且char占一个字节(byte),unsigned long 占4个字节
sizeof(tagABC)=12; 
pAbc+0x100= 0x100000 + 0x100*sizeof(tagABC) //sizeof(tagABC)=12 
(ULONG)pAbc+0x100= 0x100000 + 0x100*sizeof(ULONG) //sizeof(ULONG)=4(视机器而定) 
(ULONG*)pAbc+0x100= 0x100000 + 0x100*sizeof(ULONG*) //sizeof(ULONG*)=4 
(char*)pAbc+0x100= 0x100000 + 0x100*sizeof(char*) //sizeof(char*)=4 

如果按十六进制乘所有数就都转成16进制后再相乘: 
0x100*sizeof(tagABC) = 0x100*0xC = 0xC00; 
0x100000+0xC00 = 0x100C00; 

3.
union
{
     int k;
    char i[2];
}*s,a;
s=&a;
s->i[0]=0x39;
s->i[1]=0x39;

printf("%x\n", a.k);

如果int是4字节的话打印出来应该是0xcccc3839.看样子应该是VC平台。

共用体里里面定义的成员共用相同的存储空间,空间大小按照成员中最大的空间分配。

共用体里里面定义的成员共用相同的存储空间,空间大小按照成员中最大的空间分配。

所以ki[2]共用一块4字节内存,Win32小端模式下低字节在前,所以在内存顺序是:k0 k1 k2 k3,但这4个字节又与i[2]共用,即k0i[0]共用,k1i[1]共用,所以i[0]=0x39,i[1]=0x38后同时给k0,k1赋值了。

由于VC调试态下默认将内存空间初始化为0xcc/0xcd,所以会k2=0xcc,k3=0xcc 打印出来k就是k3 k2 k1 k0 就是0xcccc3839

若int占2位则结果是14393;(0x3839)


4.
#include<stdio.h>
#include<string.h>

void main()
{
    int i; char acNew[20]; int j=0;
    for(i=0;i<10;i++)
    {
        acNew[i]='0';
    }
    printf("%d\n",strlen(acNew));
}  
答案:不确定。应为数组中没有结束符。

5.

"char *s="\ta\017bc";"则指针变量s指向的字符串所占的字节数是多少

答案:5个,分别是:'\t' 'a' '\017' 'b' 'c' '\0'
阅读(1204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~