《C和指针》学习笔记[第三章 数据]

1.

int main(void)
{
    printf("SCHAR_MIN %d\n", SCHAR_MIN);
    printf("SCHAR_MAX %d\n", SCHAR_MAX);
    printf("UCHAR_MAX %d\n\n", UCHAR_MAX);
    
    printf("SHRT_MIN %d\n", SHRT_MIN);
    printf("SHRT_MAX %d\n", SHRT_MAX);
    printf("USHRT_MAX %d\n\n", USHRT_MAX);
    
    printf("INT_MIN %d\n", INT_MIN);
    printf("INT_MAX %d\n", INT_MAX);
    printf("UINT_MAX %d\n\n", UINT_MAX);
    
    printf("LONG_MIN %ld\n", LONG_MIN);
    printf("LONG_MAX %ld\n", LONG_MAX);
    printf("ULONG_MAX %lud\n\n", ULONG_MAX);
    
    printf("LLONG_MIN %lld\n", LLONG_MIN);
    printf("LLONG_MAX %lld\n", LLONG_MAX);
    printf("ULLONG_MAX %llud\n\n", ULLONG_MAX);
    
    return EXIT_SUCCESS;
}

 

SCHAR_MIN -128
SCHAR_MAX 127
UCHAR_MAX 255

SHRT_MIN -32768
SHRT_MAX 32767
USHRT_MAX 65535

INT_MIN -2147483648
INT_MAX 2147483647
UINT_MAX -1

LONG_MIN -9223372036854775808
LONG_MAX 9223372036854775807
ULONG_MAX 18446744073709551615d

LLONG_MIN -9223372036854775808
LLONG_MAX 9223372036854775807
ULLONG_MAX 18446744073709551615d

2.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <float.h>

#include "t_c.h"

int main(void)
{
    printf("FLT_MIN %g\n", FLT_MIN);
    printf("FLT_MAX %g\n\n", FLT_MAX);
    
    printf("DBL_MIN %g\n", DBL_MIN);
    printf("DBL_MAX %g\n\n", DBL_MAX);
    
    printf("LDBL_MIN %Lg\n", LDBL_MIN);
    printf("LDBL_MAX %Lg\n\n", LDBL_MAX);

    return EXIT_SUCCESS;
}
FLT_MIN 1.17549e-38
FLT_MAX 3.40282e+38

DBL_MIN 2.22507e-308
DBL_MAX 1.79769e+308

LDBL_MIN 3.3621e-4932
LDBL_MAX 1.18973e+4932

3.[看了答案]

通过typtedef 创建类型的别名

在32位机器上创建

typedef signed char int8;
typedef short int  int16;
typedef int  int32;
typedef int defint8;
typedef int defint16;
typedef int defint32;

在16位机器上创建

typedef signed char int8;
typedef int  int16;
typedef long int  int32;
typedef int defint8;
typedef int defint16;
typedef long int defint32;

4.

int main(void)
{
    long n = 32;
    short m;
    m = n;
    printf("%d\n", m);

    return EXIT_SUCCESS;
}

当long的变量没有超过short的最大值或最小值的时候,正确。否则错误

我的编译器没有任何提示

5.

int main(void)
{
    double n = 3.14;
    float m;
    m = n;
    printf("%g\n", m);

    return EXIT_SUCCESS;
}

没有任何提示,在float范围内正确

int main(void)
{
    double n = 3.14159265357e33;
    float m;
    m = n;
    printf("%lf\n", n);
    printf("%f\n", m);

    return EXIT_SUCCESS;
}
3141592653570000260842979827122176.000000
3141592547701797897012520417230848.000000

出现了精度差

6.

int main(void)
{
    typedef enum {PENNY=1,NICKLE=5,DIME=10,QUARTER=25} money;
    
    money pp;
    
    pp = QUARTER;
    
    printf("penny %d\n", PENNY);
    printf("pp %d\n", pp);
    
    return EXIT_SUCCESS;
}

7.

32

48

8.

int main(void)
{
    char *string = "hello world";
    
    string[0] = 'H';
    printf("%s\n", string);
    
    return EXIT_SUCCESS;
}

默认不行报错

Bus error: 10

 cc -fwritable-strings t_c.c ;./a.out 

这样可以

9.

signed主要是用来给char用的,因为不同的系统的char的默认类型可能为 unsigned char或signed char,对于一些编译器对于默认的char int等

不确定具体类型的,加上这个,可以明确。

10.

这个问题可能翻译的不是很好。容纳的数字的数量是一样的,因为bit位是一样的,但无符号的理解,可以表示更大的数字。

11.[抄答案]

float的范围比int大,但如何它的尾数不比int更多,它并不能比int表示更多不同的值。前一个问题的答案已经提示了它们应该能够表示的不同值的数量是相同,但在绝大数浮点系统中...

12.

我觉的功能是一样的,一个分开写,一个写在一起。第一个定义了a并赋值,第二个先定义a,后赋值。

13.

那第二个就无法进行赋值,因为const声明之后为常量,不可修改值的内容。

14.

是错的,就算定义了static为静态变量,但也能改变该变量的作用域范围。

15.

这是错的,函数a申请的自动变量,只能在函数a中范围,exter int x 能访问外部的全局变量。

16.

不会,改成静态变量,不会修改变量的作用域范围。

17.

不需要

18.

不需要

19.

需要声明extern int num;

20.

会的,添加了static,该变量只能在本源文件的函数中能够读取,修改.

21.

有可能,但不应该指望它。应该只不过是可能

22.

代码块内部是局部变量,只能变量在栈区,只能在内部共享,使用。在代码块外部,属于全局变量[书中叫文件作用域],所有的源文件都可以读取该变量。

23.[网上查找,主要被第一个a搞了一票,卡住了,只要将a定义y后面即可]

#include<stdio.h>
static char b = 2;
void y( void )
{
}
int a = 1;
void x( void )
{
    int  c = 3;
    static float d = 4;
}
int main(int argc, char *argv[])
{

    return 0;
}

24.

可以编译通过的

static int w = 5;
extern int x;

static int y = 10;

static float
func1(int a, int b, int c)
{
    int d, e = 1;
    {
        int d, e, w;
        {
            int b, c, d;
            static int y =2;
            printf("b = %d\n", b);
        }
    }
    {
        register int a, d, x;
        extern int y;
        printf("y = %d\n", y);
    }
    
    return 0;
}

//static int y; 放这里,因为前面函数申请需要读取全局变量y,在后面申请全局变量y,说明文件作用域有两个全局的y不行。

float
func2(int a)
{
    extern int y;
    static int z;
    
    return 0;
}

 

posted @ 2022-05-31 00:42  就是想学习  阅读(50)  评论(1编辑  收藏  举报