C数据类型

# C里的数据类型

                                                                                                                                                                                                         
我也不知道我为什么要写这样一篇口水话,可能是我想要抑制一下我看三俗重口小说和打游戏的欲望,也可能是想要总结和巩固下之前认为不太留意的点吧。点成线,线成面,面成维,1维2维3维4维超维,让我们用数据的大网来创造出一个公平公正公开高效的世界。

 

## 变量和常量

有时候觉得世界给予我太多的信息,需要一个64位的操作系统帮我理智的处理、分类,总结这些信息,让我可以像理性人一样,做的每一个决定都能使我的利益最大化。但是或许世界的精彩之处就在于人拥有机器无法拥有的情感,毕竟“精彩”一词就极富主观色彩。我不知道百科上是怎么定义“信息”一词的,于我而言,我想是书架间那本冗长的古典名著里面的*&%……¥(嗯?至今没看懂?),或是客观的实效性新闻(像是有人在哪一天哪一刻看到国名老公吃了一根惊天骇地的热狗),或是pub里那一阵撩人心炫的吉他声,让我想起了那些觥筹交错以及爱恨情仇。又或者,是那些求导求积的公式,它们主要由数字和一些符号组成,比如说666,(,a, etc.  而由数字和字符组成的信息,在c里,这就叫数据。

数据指承载信息的数字和字符。数据一般都会被提前声明在函数主体前端,并进行初始化。一个程序中要用到的数据的类型可按它们在程序执行过程中的改变与否分为常量和变量。

常量是指在程序运行过程中不会改变的量。以下为一个例子,

#include<stdio.h>
int main()
{
int a=1;
int b=2;
a=b;

printf("%d%d",a,b);
}

在执行程序过程中这里面的b的值一直都是2没有变过,所以b在此就是一个常量。

反之,变量指在运行过程中改变或者被再次赋值的数据。上面的例子中的a值从1变为了2,因为它之后被赋予了b的值。再举个例子,

#include<stdio.h>
int main()
{
int a=1;
int I;
 for (I=0;I<2;I++)
 a++;
 printf("%d",a);
}
这里的a,在程序执行的过程中,自己就发生了改变,值从1到了3,a在此就是一个变量。

## C语言基本数据类型

小时候不知道从哪本伪爱情短篇里读到过,有一天一个女孩面临了一个选择,如果必须要失去一样能力,是选择和情人种种的美好回忆还是现下思考的能力,她的选择我忘了,我只记得我选择了后者,毕竟我认为往后余生几十年只活在一段不断重复的回忆里,是一件枯燥的事情,也意味着我从那时起其实就从新的生活中死去了吧。这让我想起了《别相信任何人》里面的那个女人,一觉醒来发现自己睡在一个陌生男人身旁,却被告知那个男的是他的丈夫,自己患有失忆症。之后她在医生和她的丈夫间不断的猜疑发生了什么,即使惶恐甚至恐惧着,但每天如新生般醒来面对一堆新奇的事情至少是充实的。所以从另一个角度来讲,如果我是一台mac pro,我希望我的主人随时都能给我更新系统,如果我是一个程序,我希望我是一个具有交互的功能的程序,我希望我能够源源不断的接收到新奇的数据,而不是一尘不变。或许数据会很多也很杂,我会很烦恼怎么去处理,但就像人会将在视网膜上形成的倒像自动修正美化,c也有一套自己归纳总结不同类型的方法,它通过人输入的不同数据类型的关键字识别其类型,输出相应类型的数据。以下就是c常见的数据类型:


int


int数据最小的取值范围目前为【-32768,32767】。随着科技日新月异,cpu目前已可达到64位,这意味着int类型数据可以有更大的取值范围。但是在16位电脑里,一个int类型的数据仍占用16位,也就是说取值范围还是在【-32768,32767】。为什么占16位就非得是【-32768,32767】呢。

16位的储存空间的话,

我们想象有16个空位,一个空位被用来装符号(int 可以包含负整数),还剩下15个空位,

在储存数据都是用2进制的情况下,取值最大的情况为

符号位 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

转换成10进制
2的0次方+...+2的14次方,用积分求和公式,就是2的14次方-1=32767

同理得到16位下int数据可取最小值为-32767,

但是0在转换过程中转换了两次,所以根据补码原则,由-32768代替-0,

所以一个int数据类型取值范围最小为【-32768,32767】

short int
由字见义,short int 所占储存空间比int 少或者两者一样,所以可用于数值较小的情况。short int 也是signed符号类型,正负整数都可表示(一般未加前缀都默认为是signed
 
long int
由字见义。。

long long int/long long (c99新加)
由字见义,此类型数据至少占位64,所占储存空间比long int还大。适用于更大的数值。

unsigned int/unsigned
这个数据类型,乍一看和int是一样的,只不过的前面加了个unsigned。但是它却可以比同位数的操作系统下的int表示更大的数,为什么呢?

是因为unsigned表明此数据类型只能表示正整数(包括零),在16位的操作系统里,unsigned int 需要16位的储存单元,但此处,它不再像int一样需要占用一位来储存符号了,所以2的0次方+...+2的15次方得到最大值为65535,所以unsigned int 最小的取值范围为【0,65535】。

以下的类型为c90中新加数据类型

unsigned long int /unsigned long 

unsigned short int/unsigned short 

unsigned long long int/unsigned long long 

unsigned short short iht/unsigned short short 

由字见义。其实每个数据类型在不同的操作系统下所占储存空间和可取值范围都是不同的,所以,或许久经沙场的程序员才能熟记于心其中的差别吧。现在我的64位电脑上
short 为16位,int为16或者32位,long为32位,long long 为64位,由此可推演其可取值范围和加有unsigned数据类型取值范围。

前面提到了c90、c99标准。它们是什么呢,我的理解呢,它就像米原器,就像英语26个字母,就像主谓宾语法结构,就像信件上方的dear/hi和结尾的thanks/thank you/sincerly 一样,它定义了c语言及其使用方法,让我们能够在同一个基准下交流,1989年美国国家标准协会(ansi c)颁布了新的标准,,在前期1978年k&r标准未定义标准库的前提上增加了对其的定义。让我们可以放心大胆的使用printf() getchar()这些库函数。之后ansi c又在94年颁布了出c99,让c变得更加国际化。这就是c90和c99的诞生。但是目前有些电脑仍旧在使用较老的编译器,所以c99下编写的程序某些地方可能不会被识别转换,所以,查看自己的编译器版本还是必要的,但是使用mac os的人,在xcode这类ide环境编译是一件相对轻松的事吧,虽然我仍旧处于懵的阶段。

之前讲的所有数据类型,都可归为整形数据类型。在提出其他数据类型之前,先了解一下他们的输出方式。
int类型用d%表示。
但是除了10进制外,还可以用8进制和16进制输入数字。因为电脑使用的机器语言是用2进制形式储存数据的,当使用8进制或16进制输入数据时,会非常有利于数据的表达和转换。例如,

16进制下2用2进制表达为0010
16进制下3用2进制表达为0011,
而16进制下23用2进制表达为100011,

这样看来,使用16进制将会对数据转换起到极大的简化作用,因为16是2的4次方,所以2进制下数字每进4位就相当于16进制下数字进一位,所以,每一位16进制数据都可以用4位2进制数字来表示,同理,每位8进制数字也可以用3位2进制数字表示。在输入时,在数据前加0x/0X表示此数为16进制下数据,在数据前加0表示此数据为8进制数据。

基于以上,
如果想要输出八进制数据,在输出时应使用%o
如果想要输出八进制数据,在输出时应使用%x
如果想要在输出时显示此数据的前缀来强调此数据的是多少进制,在输出时应使用%#x/%#X/%#o。

下面我们顺带来回顾下不同进制之间的转换规则。 

2进制转10进制

例如:

2进制下的100
1 0 0

1*2^2
+
0*2^1 
+
0*2^0
=4

原理为2进制下数字到2进1位,所以从右边初始位开始计算。(因为个位数小于2的情况不满足进位条件,所以从2的零次方开始计算)而当数位上数字为0时,说明此数位已超前进过位了,所以此位不需要参与计算,所以在前乘0即可。

10进制转2进制

除2取余法(也可以硬算,但使用此方法简单点)

例如:

10进制下的44
4
4/2=2...0
2/2=1...0
1/2=0...1
得到100

2进制转8进制

例如:

2进制下的100100
因为1位八进制数由三位2进制数组成,将2进制下数据三位为一组分开 100  100
计算100
为 2^2=4
再计算100
为 2^2=4
所以
100100转换为8进制下的44


8进制转2进制
除2取余法(也可以硬算,但使用此方法简单点)

例如:

8进制下的44
4/2=2...0
2/2=1...0
1/2=0...1
4/2=2...0
2/2=1...0
1/2=0...1
所以44转换为2进制下的100100

2进制转16进制

例如:

2进制下的100100

同8进制类似,但是以4位为一组。(不足补0,8进制同理)

0010  0100

2^1=2
2^2=4

转换为24

16进制转2进制

例如:

16进制下的24
2  4
2/2=1...0
1/2-0...1
补全空位为0010
4/2=2...0
2/2=1...0
1/2=0...1
补全空位为0100
转换为00100100

如果要以十进制转换的话,可以先将其转换为2进制,再做转换。也可以直接转,这就要理解转换的本质,到底要除8还是除16,因数施教。

话题扯远了,还是继续来讲整数类型的输出方式,除了以上讲的int的输出,还有

unsigned int ,在输出时使用%u转换符
long,(使用l前缀)
10进制下long,在输出时使用%ld
8进制下long,在输出时使用%lo
16进制下long,在输出时使用%lx
short,(使用d前缀)
10进制下short,在输出时使用%hd
8进制下short,在输出时使用%ho
16进制下short,在输出时使用%hx
l和d前缀也可配合%u使用
10进制下unsigned long,在输出时使用%lu
10进制下unsigned short,在输出时使用%hu

*%o %x输出的都是都是无符号类型

 char

在c中,第二常见的数据类型就是char,此数据类型用于储存字符。但计算机语言使用数字来储存信息,所以其实char类型的数据仍旧是以整数类型储存的,目前我们通用ascll码来处理相应的char数据。

char数据类型,需占用8位空间来储存,也就是一个字节。而ascll码只需用到7位,(换算成取值范围为0-127)所以char是可以容纳ascll码,使用ascll码可打印一些特殊字符。

如果我们在函数前部要对字符类型数据进行初始化的话,需要注意其书写格式。我喜欢这样赋值,
#include<stdio.h>
main()
{
char age=21;
}
这样的格式是允许的,因为机器语言是通过二进制数字来储存信息的,所以char本质上也是整型数据,可以用数字来赋值,但是要注意数字取值不可超过ascll码最大取值(127)。

但是以下格式才是正确格式,
#include<stdio.h>
main()
{
char age='A';
}
电脑会自动将识别到的'A'转换为代码值,但是注意不要忘记单引号,没有它电脑会直接将A做变量处理,出现你还未定义次变量的错误提示。

关于字符常量的使用,不局限在10进制,8进制,16进制也可以啊,就像要表达一个思想,中文可以,英文可以,西班牙语也可以啊,可是有些国家的取值范围远大于127,使得ascll码没有办法表达,所以unicode设计了一个系统,以此表达世界上大多数的字符,此系统字符集目前已超过10万。

如想用8进制ascll码来表示字符,需在ascll码前加\

#include<stdio.h>
main()
{
char bravo='\100'
printf("%d",bravo)
}
此处对应的ascll码应是十进制下的144,所以输出的应该是144而不是100。

类似的,如想用16进制ascll码来表示字符,需在ascll码前加\x或\X

输出时,如需要以字符形式输出,需使用%c。如果仍旧使用%d,打出的值会是一个整数(char是以二进制整数储存的)

 

 Bool


和python一样,c也是有bool此类数据类型的因为bool所储存的值只有true或者false两个,所以二进制数字0和1就可以满足,1位的储存空间就足矣。

好的,累了,下次再总结具有更高进度的float,double float吧,包括他们的输出方式,书写方法,二进制下表示方法,输入数据类型超出所能储存的最大值,overflow了怎么办,以及还有不怎么熟悉的complex类型,但是现下,

I'm off to a radio called 食色性,they are fucking funny okkk?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值