第3章 数据

3.13 问题

1. 1个字符占了一个byte。范围为-128~127;整数类型有short, int, long, 分别占了2,4,8个byte。范围麻烦自己动手算~(233333)

2. 浮点数类型有float, double,分别占4,8个byte。

3. 

/*在32位机器上*/
typedef signed char     int8;
typedef short           int16;
typedef int             int32;
typedef int             defint8;
typedef int             defint16;
typedef int             defint32;

/*在16位机器上*/
typedef signed char     int8;
typedef int             int16;
typedef long            int32;
typedef int             defint8;
typedef int             defint16;
typedef long            defint32;

4. 首先要说的是,把long整型变量赋值给short整型变量会按二进制截断。如果该long类型的整型变量的值没有超过short类型能表示的值的范围,那问题不大;但是如果超过能表示值的范围,就可能造成数据丢失,轻者程序与预期结果不符合,重者程序崩溃。每种编译器都可能会有不同的结果值。

5. 浮点数把double变量赋值给一个float变量其实是一样的道理,会按二进制截断。(同上原理)

6. 

enum COIN
{
    PENNY = 1, NICKEL = 5
};

7. 打印不了,会提示程序错误无法编译。jar的值实际上是整数。%s用于打印字符串而不是整数。

8. P34:许多编译器都允许程序修改字符串常量(K&R C);许多ANSI编译器不允许修改字符串常量(ANSI C)。

9. 可能signed的作用就在于整数家族中有个不容易分辨的家伙(char),它缺省时有可能是signed,也有可能是unsigned。

10. 不可能。相同长度说明二进制位数相同,则可以表示的值的数量是相同的,只是无符号的不能表示负数且比有符号的能表示的正数多。

11. 如果int和float都是32位,则能表示的值的数量讲道理是一样的。但是如果了解了浮点数的表示方法,则知道浮点数有三种大分类:规格化数、不规格化数和特别数(例如NaN),其中特别数占用了一些数量,导致float能表示的值的数量其实比int少。

12. 

/*给变量分配存储空间并赋值*/
int a = 25;

/*先给变量分配存储空间,但是变量的值是随机的(垃圾值)*/
int a;
/*然后再给变量赋想要的值*/
a = 25;

13. 如果声明中包含const,那么只有第一种可以完成任务,第二种是不行的。

14. 错。一般情况下在代码块内部声明的变量只有在代码块内部才能访问,是为局部变量。但是如果声明的变量前面有extern关键字,那么它就为全局变量,就可以从该代码块的任何位置根据名字来访问。

15. 对。

16. 如果x被声明为static,那么答案就是错。static有两种用途:(1):当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。(2):当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。

17. 不需要添加额外的说明。

18. 不会。

19. 不需要添加额外的说明。

20. 如果问题19中的声明包含了关键字static,那么变量只能在声明的源文件中被访问,其他源文件不能访问。

21. 值有可能相同不过概率太低。函数被重复调用,自动变量每次都将重新创建。在代码块再次执行时,这些自动变量在堆栈中所占据的内存位置有可能和原先的位置相同,也可能不同。即使它们所占据的位置相同,你也不能保证这块内存同时不会有其他的用途。因此,我们可以说自动变量在代码块执行完毕后就消失。当代码块再次执行时,它们的值一般并不是上次执行时的值。

22.  如果出现在代码块内部,则为局部变量;如果出现在代码块外部,则为全局变量。

23. 

char b = ‘2’;
int y()
{
}
int a = 1;
int x()
{
    int c = 3;
    static float d = 4;
}

24. 

/*根据变量出现的早晚给变量从1取名,好分辨。当然,这只是方便说明*/
static int w1 = 5;
extern int x1;
static float func1(int a1, int b1, int c1)    
{
    int c2, d1, e1 = 1;
    ...
    {
        int d2, e2, w2;
        ...
        {
            int b2, c3, d3;
            static int y1 = 2;
            ...
        }
    }
    ...
    {
        register int a2, d4, x2;
        extern int y2;
        ...
    }
}

static int y3;

float func2(int a3)
{
    extern int y4;
    static int z1;
    ...
}

作用域如下:

a1: 6~18;23

a2: 19~22

a3: 28~31

b1: 6~11; 16~23

b2: 12~15

c1: 没有

c2: 6~11; 16~23

c3: 12~15

d1: 6~8; 17~18; 23

d2: 9~11; 16

d3: 12~15

d4: 19~22

e1: 6~8; 17~23

e2: 9~16

w1: 1~8; 17~31

w2: 9~16

x1: 2~18; 23~31

x2: 19~22

y1: 13~15

y2: 20~23

y3: 24~27

y4: 28~31

z1: 29~31

猜你喜欢

转载自www.cnblogs.com/astralcon/p/12542414.html