9.C进阶之数据类型


9.1.基本数据类型
(1)数据类型分为基本数据类型和复合数据类型。基本数据类型有char、short、int、long、float、double;复合数据类型有数组、结构体、共用体、类(C语言没有类,C++有)。
(2)数据类型类似于模子,该模子实例化出C语言的变量。变量存储在内存空间需占用内存空间,变量占用内存空间的具体大小由数据类型决定。每种数据类型在不同的机器平台上所占用的空间大小是不同的。我们一般以32位CPU为默认硬件平台来描述:char(1字节)、short(2字节)、int(4字节)、long(4字节)、float(4字节)、double(8字节)。


(3)对于char、short、int 、long等整形类型的数,都分有符号有无符号数;而对于float和double这种浮点型数来说,只有有符号数,没有无符号数。在C语言中变量存储的时候是以二进制方式存储的,有符号数和无符号数在内存中的存储方式不同的。譬如unsigned int无符号数,32位(4字节)全部用来存数的内容,则数值范围是0~4294967295(2^32 - 1);signed int有符号数,32位中最高位用来存符号(0表示正数,1表示负数),剩余的31位用来存数据,所以可以表示的数的范围是 -2147483648(2^32)~2147483647(2^31 - 1)。


(4)对于float和double这种浮点类型的数,其在内存中的存储方式和整形数不一样。所以float和int相比,虽然都是4字节,但是在内存中存储的方式完全不同。所以同一个4字节的内存,如果存储时是按照int存放的,取的时候一定要按照int型方式去取。如果存的时候和取的时候理解的方式不同,那数据就完全错了。
(5)总结:存取方式上有整形和浮点型两种,这两种存取方式完全不同,没有任何关联。则绝对不可随意改变变量的存取方式。在整形和浮点型之内,譬如说4种整形char、short、int、long只是范围大小不同而已,存储方式是一模一样的。float和double存储原理是相同的,方式上有差异,导致了能表示的浮点型的范围和精度不同。


9.2.空类型
(1)C语言中的void类型,代表任意类型,而不是空的意思。任意类型的意思不是说想变成谁就变成谁,而是说它的类型是未知的,是还没指定的。
(2)void *是void类型的指针,表明这是一个指针变量,该指针指向一个void类型的数。void类型的数即这个数的数据类型不确定,哪种类型都有可能,只是我们当前不知道。
(3)void型指针的作用就是,程序本身不知道该变量的类型,但是程序员自己通过存取数据类型必须一致可以知道该变量的类型。这些类型对不对,能否兼容,完全由程序员自己负责,编译器看到void就没办法帮你做类型检查了。
(4)在函数的参数列表和返回值中,void代表的含义是:若函数形参列表为void,表示这个函数调用时不需要给它传参;若函数返回值类型是void,表示这个函数不会返回一个有意义的返回值,所以调用者不要去使用该返回值。
(5)C语言设计基本理念:C语言相信程序员永远是对的,C语言相信程序员都是高手,C语言赋予了程序员最大的权利。所以C语言的程序员必须自己对程序的对错负责,必须随时脑袋清楚,知道自己在干嘛。


9.3.数据类型转换
(1)C语言中有各种数据类型,写程序时需要定义各种类型的变量,这些变量需要参与运算,C语言基本规则:不同类型的变量是不能直接运算的。即int和float类型的变量不能直接加减等运算,你要运算,必须先把两种类型转成相同的类型才可以。
(2)隐式转换就是自动转换,是C语言默认会进行的,不用程序员干涉。隐式类型转换默认朝精度更高、范围更大的方向转换(在运算中)。隐式类型转换需无条件转换成左值的类型(在赋值中)。
(3)C语言默认不会这么做,但是程序员我想这么做,所以我强制这么做了。


9.4.C语言与bool类型
(1)C语言中原生类型没有bool,C++中有。
(2)在C语言中如果需要使用bool类型,可以用int来代替。很多代码体系中使用宏定义来定义真和假#define TRUE 1 #define FALSE 0。
(3)在bool类型的世界里,除了0(为假)之外,其余全为1(为真)。


9.int_float
/*
 * 公司:XXXX
 * 作者:Rston
 * 博客:http://blog.youkuaiyun.com/rston
 * GitHub:https://github.com/rston
 * 项目:C进阶之数据类型
 * 功能:变量存储和取出方式必须一致。
 */
#include <stdio.h>

int main(int argc, char **argv)
{
    int a = 8;

    // a = 8. a = -0.000000. 编译器报类型不匹配警告。
    printf("a = %d. a = %f.\n", a, a);

    return 0;
}

9.void
/*
 * 公司:XXXX
 * 作者:Rston
 * 博客:http://blog.youkuaiyun.com/rston
 * GitHub:https://github.com/rston
 * 项目:C进阶之数据类型
 * 功能:空类型变量及空类型指针变量。
 */
#include <stdio.h>

// 函数声明
void test(void);

int main(int argc, char **argv)
{
    int a = 4;
    void *pVoid = &a;                       // 定义void *类型指针变量pVoid并初始化,使其指向int型变量a。

    test();                                 // 测试void类型用于函数形参和函数返回值

    //printf("a = %d.\n", *pVoid);          // 编译报错,存储和取用时类型不一致。
    printf("a = %d.\n", *(int *)pVoid);     // 正确,存储和取用时类型一致。a = 4.
    printf("a = %f.\n", *(float *)pVoid);   // 编译无提示。错误,存储和取用时类型一致,a = 0.000000.

    return 0;
}

// void类型用于函数形参和函数返回值表明不需要传参合返回值。
void test(void)
{
    printf("This is a void test.\n");
}

9.type_convert
/*
 * 公司:XXXX
 * 作者:Rston
 * 博客:http://blog.youkuaiyun.com/rston
 * GitHub:https://github.com/rston
 * 项目:C进阶之数据类型
 * 功能:C语言中的数据类型转换分析。
 */
#include <stdio.h>

int main(int argc, char **argv)
{
    int a = 3, c = 0;
    float b = 3.5;

    c = a + b;
    printf("c = %d.\n", c);                 // c = 6. a转换为float与b相加得到的结果为float再转换为int赋值给C。
    printf("a + b = %f.\n", a + b);         // a + b = 6.500000. a转换为float与b相加得到的结果为float直接打印输出
    printf("a + b = %d.\n", (int)(a + b));  // a + b = 6. a转换为float与b相加得到的结果为float再转为int直接打印输出
    printf("a + b = %d.\n", a + b);         // 编译报警,a + b = 0. 结果错误,存取类型不一致所致。

    return 0;
}

9.bool
/*
 * 公司:XXXX
 * 作者:Rston
 * 博客:http://blog.youkuaiyun.com/rston
 * GitHub:https://github.com/rston
 * 项目:C进阶之数据类型
 * 功能:C语言中的bool类型。
 */
#include <stdio.h>

int main(int argc, char **argv)
{
    int a = -12;

    if (a)      // 在bool类型的世界,除了0是假之外,其余数都是1,都是真
    {
        printf("a = %d.\n", a);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值