zerglurker的C语言教程003——基本数据类型

来源:互联网 发布:雅马哈电子琴670数据轮 编辑:程序博客网 时间:2024/05/16 00:47
#include <stdio.h>int main(int argc, char** argv, char** env){printf("hello world!\n");return 0;}

这个是第一课的代码,不知道大家是不是还有映像

里面诸如:int、char、char** 都是属于数据类型说明。它说明其后的参数、变量、函数返回值的数据类型

在c语言里面,基本的数据类型和说明如下:

char  字符类型  长度是1字节,也就是8个bit位。用形如0x41 或者'A'来表示。

short 短整数型 长度是2字节,也就是16个bit位。各位以后常见的wchar_t(宽字符类型)就是用本类型作原型。示例数值0x7FFF(最大正短整数)

int      整数类型 长度不定,一般是4字节。说一般是因为在部分16位的单片机代码中,它的长度可能会是2字节。注意,即使在64位开发环境(也就是为64位cpu准备的开发环境)

          ,本类型的长度也不会超过4字节。示例数值:0x7FFFFFFF

long  长整数型 长度是4字节。这个数据类型现在有点鸡肋。以前16位cpu时代,这个类型是用来区分2字节整数和4字节整数的。示例数值:0x7FFFFFFFL 这个L表示该常量是

           一个长整数。

下面的数据类型则是在新版本的编译器才支持的,一些旧版本编译器,比如一些教程上提到的Trobe-C1.0或者2.0可能会不支持

long long 64位整型 长度是8字节。有鉴于64位硬件越来越多,各个编程语言也开始加入一些原本没有的数据类型,以适应这种扩展。进而诞生了long long。请注意,这种64位

                  的数据类型是额外加入编译器的,所以它们的运算可能并非如你预计的那样高效。因为很多编译器会通过调用函数的方式来实现运算功能。另外一些编译器甚至会将

                 其作为32位处理,而不告诉你。导致的计算结果和你预期的完全不一样。示例:0x7FFFFFFFFFFFFFFFLL 注意LL后缀表示这是一个64位整数,通知编译器不要当做

                 32位处理了

上述所有类型前面可以加一个unsigned 关键字,声明一个无符号的整数类型。诸如:unsigned char(取值范围为0~255) unsigned short(取值范围为0~65535)等等

float 浮点类型 32位浮点数 形如1.2f、3.987f 数值范围-3.4*10^38~+3.4*10^38 有效位数在6~7之间。值得注意的是,由于小数实际上是以二进制存储的,所以对于0.3、0.7这样的数,实际上是不可能精确表达的。因为0.3二进制形式是这样的0x3e9999999999… 实际计算机会保存为0x3e99999a这样,和0.300000012等价

double 双精度 64位浮点数 形如1.2  3.1415926535 注意,代码中的小数,没有特别后缀,默认都是双精度的。所以当你要给一个float赋值的时候,请务必带上f后缀。否则编译器会给你做一个强制转换。这种转换有时候具有极大的破坏力。因为代码实际逻辑和你预期的逻辑可能差之毫厘,最后导致结果谬以千里。

double double 长双精度 128位浮点数 注意,这种数据类型仅限gcc编译器,vs2013里面是没有这种长双精度的。虽然vs提供一种所谓的long double类型,但是它和double没有任何差别——除了名字里面多了一个long。另外即使是gcc编译器,对于这种怪兽级别的数据支持也非常有限。你最好不要用它来做运算,否则一旦超过double的范围,后果就非常不靠谱了。

void 空类型 这种类型只能声明函数的返回值。表示函数不会返回任何值。

上述所有的类型后面追加一个*,就是一个新的基础类型,指针类型。例如:void* double* float* char* unsigned short*等等

指针的详细描述我会在后面介绍。

此外,c++还提供了额外的数据类型:

bool 布尔型 其值分为0和非0 非0表示true 0表示false 所以bool变量 1 和bool变量2是相等的。值得注意的是,bool变量占用1个字节的空间,是一个8位数据

最后再附上一段代码,可以方便查看自己的开发环境中这些变量类型的长度以及最大值:

#include <stdio.h>int main(int argc, char** argv, char** env){char var1 = 0x41;short var2 = 32767;int var3 = 0x7FFFFFFF;long var4 = 2147483647;float var5 = 1.23456789f;double var6 = 1.23456789012345;long long var7 = 0x7FFFFFFFFFFFFFFFLL;bool var8 = (bool)99;unsigned char var11 = 0xFF;unsigned short var12 = 0xFFFF;unsigned int var13 = 0xFFFFFFFF;unsigned long var14 = 4294967295;unsigned long long var17 = 0x7FFFFFFFFFFFFFFFLL;printf("char var1 %d bytes %d\n", var1,sizeof(var1));printf("short var2 %d bytes %d\n", var2, sizeof(var2));printf("int var3 %d bytes %d\n", var3, sizeof(var3));printf("long var4 %ld bytes %d\n", var4, sizeof(var4));printf("float var5 %f bytes %d\n", var5, sizeof(var5));printf("double var6 %f bytes %d\n", var6, sizeof(var6));printf("long long var7 %lld bytes %d\n", var7, sizeof(var7));printf("bool var8 %d bytes %d\n", var8, sizeof(var8));printf("unsigned char var11 %02X bytes %d\n", var11, sizeof(var11));printf("unsigned short var12 %u bytes %d\n", var12, sizeof(var12));printf("unsigned int var13 %u bytes %d\n", var13, sizeof(var13));printf("unsigned long var14 %lu bytes %d\n", var14, sizeof(var14));printf("unsigned long long var17 %llu bytes %d\n", var17, sizeof(var17));getchar();return 0;}





1 0
原创粉丝点击