数据类型(通用8篇)
HASH类型-特点
Redis hash 是一个 string 类型的 field 和 value 的映射表.它的添加、删除操作都是 O(1) (平均) ,
hash 特别适合用于存储对象。 相较于将对象的每个字段存成单个 string 类型。 将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field 数量都不太多。所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)。如果 field 或者 value的大小超出一定限制后, Redis 会在内部自动将 zipmap 替换成正常的 hash 实现. 这个限制可以在配置文件中指定hash-max-zipmap-entries 64 #配置字段最多 64 个hash-max-zipmap-value 512 #配置 value 最大为 512 字节
HASH常见命令
HSET
HSET key field value
将哈希表 key 中的域 field 的值设为 value 。
如果 key 不存在,一个新的哈希表被创建并进行HSET 操作。
如果域 field 已经存在于哈希表中,旧值将被覆盖。
时间复杂度: O(1)
返回值:
如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。
如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回 0 。
127.0.0.1:6379[15]>HSET website google “www.g.cn”(integer) 1127.0.0.1:6379[15]> HSET website google “www.google.com”(integer) 0
HSETNX
HSETNX key field value
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。若域 field 已经存在,该操作无效。
如果 key 不存在,一个新哈希表被创建并执行HSETNX 命令。
时间复杂度: O(1)
返回值:
设置成功,返回 1 。
如果给定域已经存在且没有操作被执行,返回 0 。
127.0.0.1:6379[15]>HSETNX nosql key-value-store redis(integer) 1127.0.0.1:6379[15]> HSETNX nosql key-value-store Memcached(integer) 0127.0.0.1:6379[15]>HGET nosql key-value-store“redis”
HMSET
HMSET key field value [field value …]
同时将多个 field-value (域 -值) 对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的域。
如果 key 不存在,一个空哈希表被创建并执行HMSET 操作。
时间复杂度: O(N),N 为 field-value 对的数量。
返回值:
如果命令执行成功,返回 OK 。
当 key 不是哈希表 (hash) 类型时,返回一个错误。
127.0.0.1:6379[15]>HMSET website google www.google.com yahoo www.yahoo.comOK127.0.0.1:6379[15]>HGET website google“www.google.com”127.0.0.1:6379[15]>HGET website yahoo“www.yahoo.com”
HGET
HGET key field
返回哈希表 key 中给定域 field 的值。
时间复杂度: O(1)
返回值:
给定域的值。
当给定域不存在或是给定 key 不存在时,返回 nil 。
127.0.0.1:6379[15]>HSET site redis redis.com(integer) 1127.0.0.1:6379[15]>HGET site redis“redis.com”127.0.0.1:6379[15]>HGET site mysql(nil)
HMGET
返回哈希表 key 中,一个或多个给定域的值。
如果给定的域不存在于哈希表,那么返回一个 nil 值。
因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行HMGET 操作将返回一个只 带有 nil 值的表。
时间复杂度: O(N),N 为给定域的数量。
返回值: 一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。
127.0.0.1:6379[15]> HMSET pet dog “doudou” cat “nounou”OK127.0.0.1:6379[15]> HMGET pet dog cat fake_pet1) “doudou”2) “nounou”3) (nil)
HEXISTS
HEXISTS key field
查看哈希表 key 中,给定域 field 是否存在。
时间复杂度: O(1)
返回值:
如果哈希表含有给定域,返回 1 。
如果哈希表不含有给定域,或 key 不存在,返回 0 。
127.0.0.1:6379[15]>HEXISTS phone myphone(integer) 0127.0.0.1:6379[15]>HSET phone myphone nokia-1110(integer) 1127.0.0.1:6379[15]>HEXISTS phone myphone(integer) 1
HDEL
HDEL key field [field …]
删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
时间复杂度: O(N),N 为要删除的域的数量。
返回值: 被成功移除的域的数量,不包括被忽略的域。
127.0.0.1:6379[15]>HMSET key f1 “v1” f2 “v2” f3 “v3” f4 “v4”OK127.0.0.1:6379[15]>HGETALL key1) “f1”2) “v1”3) “f2”4) “v2”5) “f3”6) “v3”7) “f4”8) “v4”127.0.0.1:6379[15]>HDEL key f1(integer) 1127.0.0.1:6379[15]>HDEL key not-field(integer) 0127.0.0.1:6379[15]>HDEL key f2 f3(integer) 2127.0.0.1:6379[15]>HDEL key f4 f1(integer) 1
HKEYS
HKEYS key
返回哈希表 key 中的所有域。
时间复杂度: O(N),N 为哈希表的大小。
返回值:
一个包含哈希表中所有域的表。
当 key 不存在时,返回一个空表。
127.0.0.1:6379[15]>HMSET website google www.google.com yahoo www.yahoo.comOK127.0.0.1:6379[15]>HKEYS website1) “google”2) “yahoo”127.0.0.1:6379[15]>EXISTS fake_key(integer) 0127.0.0.1:6379[15]>HKEYS fake_key(empty list or set)
HVALS
HVALS key
返回哈希表 key 中所有域的值,
时间复杂度: O(N),N 为哈希表的大小。
返回值:
一个包含哈希表中所有值的表。
当 key 不存在时,返回一个空表。
127.0.0.1:6379[15]>HMSET website google www.google.com yahoo www.yahoo.comOK127.0.0.1:6379[15]>HVALS website1) “www.google.com”2) “www.yahoo.com”127.0.0.1:6379[15]>EXISTS not_exists(integer) 0127.0.0.1:6379[15]>HVALS not_exists(empty list or set)
HGETALL
HGETALL key
返回哈希表 key 中,所有的域和值。
在返回值里,紧跟每个域名 (field name) 之后是域的值 (value),所以返回值的长度是哈希表大小的两倍。
时间复杂度: O(N),N 为哈希表的大小。
返回值:
以列表形式返回哈希表的域和域的值。
若 key 不存在,返回空列表。
127.0.0.1:6379[15]>HSET people jack “Jack Sparrow”(integer) 1127.0.0.1:6379[15]>HSET people gump “Forrest Gump”(integer) 1127.0.0.1:6379[15]>HGETALL people1) “jack”2) “Jack Sparrow”3) “gump”4) “Forrest Gump”
HINCRBY
HINCRBY key field increment
为哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key 不存在,一个新的哈希表被创建并执行HINCRBY 命令。
如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
对一个储存字符串值的域 field 执行HINCRBY 命令将造成一个错误。
本操作的值被限制在 64 位 (bit) 有符号数字表示之内。
时间复杂度: O(1)
返回值: 执行HINCRBY 命令之后,哈希表 key 中域 field 的值。
127.0.0.1:6379[15]>HEXISTS counter page_view(integer) 0127.0.0.1:6379[15]> HINCRBY counter page_view 200(integer) 27.0.0.1:6379[15]>HGET counter page_view“200”127.0.0.1:6379[15]> HINCRBY counter page_view -50(integer) 150127.0.0.1:6379[15]> HGET counter page_view“150”
HINCRBYFLOAT
HINCRBYFLOAT key field increment
为哈希表 key 中的域 field 加上浮点数增量 increment 。
如果哈希表中没有域 field ,那么HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。
如果键 key 不存在,那么HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。
当以下任意一个条件发生时,返回一个错误:
域 field 的值不是字符串类型 (因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)
域 field 当前的值或给定的增量 increment 不能解释 (parse) 为双精度浮点数 (double precision floating point number)
返回值: 执行加法操作之后 field 域的值。
127.0.0.1:6379[15]>HSET mykey field 10.50(integer) 0127.0.0.1:6379[15]>HINCRBYFLOAT mykey field 0.1“10.6”127.0.0.1:6379[15]>HSET mykey field 5.0e3(integer) 0127.0.0.1:6379[15]>HINCRBYFLOAT mykey field 2.0e2“5200”127.0.0.1:6379[15]>EXISTS price(integer) 0127.0.0.1:6379[15]>HINCRBYFLOAT price milk 3.5“3.5”127.0.0.1:6379[15]>HGETALL price1) “milk”2) “3.5”
HLEN
HLEN key
返回哈希表 key 中域的数量。
返回值:
哈希表中域的数量。
当 key 不存在时,返回 0 。
1 数据类型转换的方式
C语言中的数据类型转换可分为隐式转换和显式转换两种。
1.1 隐式转换
隐式转换也可称作为自动转换,它经常以以下几种形式发生:
1)在计算一个同时出现多种数据类型的表达式时,将所有数据类型都转换为同一种数据类型。
2)在对数据进行输出时,按指定格式将数据输出。
3)利用赋值运算符将数据转换为运算符左边指定的数据类型。
4)在对函数调用时,如果形参与实参的数据类型不一致,实参会自动转换为形参的数据类型。
根据转换发生的形式,可将隐式转换分为类型:一般算术转换、输出转换、赋值转换与函数调用转换。
1.1.1 一般算术转换
这种转换类型会经常出现,它是通过编译器自动实现的,不同类型的数据在一个表达式中会自动转换为最长的类型,例如:
有如下定义char a;int b,e;float c;double d;
计算a*b+c-d/e时,按计算顺序说明类型转换:
1)a*b;//char类型的a转换为int类型的值,再和int类型的b相乘。
2)d/e;//int类型的e转换为double类型的值,然后double类型的d再和e相除。
3)a*b+c;//int类型的a*b转换为float类型值,再和float类型的c相加。
4)a*b+c-d/e;//float类型的(a*b+c)转换为double类型的值,再和double类型的d/e相减。
不考虑过程,最终表达式的值为最长类型(这里是double)的值。
1.1.2 格式输出转换
这种转换类型是将某种类型的数据按照输出格式转换成指定格式。例如:
main(){int a=65;printf("%cn",a);}//输出“A”
此程序是将ASCII值为65的字符输出来,所以输出结果是“A”。
1.1.3 赋值转换
在这种转换中,会出现赋值运算符“=”,就是要将运算符右边的数据类型转换为运算符左边的数据类型,例如:
main(){int a=3.15;printf("%dn",a);}//输出结果是3
之所以会出现这种结果,就是因为运算符右边的3.15是浮点型常量,它要被转换为运算符左边的整型数据,导致整型变量被赋值为3。
1.1.4 函数调用转换
此种类型的转换主要会出现在函数调用时形参跟实参数据类型发生不一致的场合,例如:
int mul(int x,int y)//函数中的形参为int
{int a;a=x*y;return(a);}
void main()
{float a=1.23,b=2.35;
int c;c=mul(a,b);//调用函数时,由于实参是float,所以实参首先会转换为int,再执行函数体部分
printf("%d",c);}//输出结果是2
1.2 显式转换
显式转换可分为两种,即强制性数据类型转换以及利用标准函数转换。
1.2.1 强制性数据类型转换
强制性数据类型转换是将某一种数据类型强制转换为另外一种数据类型。这一种较常见。强制性数据类型转换的一般格式为:(类型标识符)表达式。例如:
main(){float a=5.6,b=2.3;printf("%dn",(int)a%(int)b);}
由于运算符“%”要求两个数据必须为int类型,如果不进行强制性数据类型转换,则系统会提示出错信息,所以浮点型数据a和b先各自转换为整型数据5和6,再进行求余运算,输出结果是1。
1.2.2 标准函数转换
这种转换是利用C语言中的标准函数将某一种数据类型转换为另外一种数据类型。例如:
main()
{int a;float b;char*c="123.45xy",*d;
b=atof(c);//将字符串c转换为float型数据
a=atoi(c);//将字符串c转换为int型数据
itoa(a,d,10);//将十进制数a转换为字符串数据并且存放在字符型指针d所指向的字符串
printf("%.4f,%d,%sn",b,a,d);//将浮点型数据b、整型数据a以及字符串数据d分别按照浮点型、十进制数整型和字符串格式输出,输出结果是:123.4500,123,123
}
2 常见问题
在对数据类型进行转换时,是为了程序的需要,可有的时候却会带来意想不到的安全隐患和错误,这就是非安全转换、输入输出格式错误与运算符数据不匹配。
2.1 非安全转换
非安全转换是将一种数据类型长的转换成其它数据类型短的数据,使其值的表示范围被缩小所出现的错误。它有如下几种情况:
2.1.1 较大整数转换为较短的类型
C语言系统一般不检测这种类型的错误,大部分的编译器在可能出现非安全转换是不会给出警告信息,因此在编程时需避免此类型转换。
如main(){long i=123456;printf("%dn",i);}//其输出结果为-6716.
又如main(){unsigned i=65535;int j;j=i;printf("%dn",j)}//输出结果为-1.
2.1.2 有符号负数转换为无符号数
例如:main(){int i=-1;printf("%u",i);}//其结果为65535
当由有符号数转换为无符号数时,原来的符号位将不作为符号,而作为数据的一部分。
2.1.3 双精度类型转换为单精度类型
例1 main()
{double i=10.123456789;float j=i;printf("%.9fn",j);
}//输出为10.123456955
例2 main()
{double i=12345678912345.123;float j=i;printf("%fn",j);
}//输出为12345679020032.000000
由于双精度类型转换成单精度类型时,可能出现以下两种情况:其一,降低精度,截断尾数,保留前8位有效数字,后面的数字无意义,如例1;其二,若数值超出了单精度所表示的范围,则得到的数据无意义,且系统不提示错误,因此在遇到较大的数据,或对数据精度要求比较高时,应避免进行此类的转换,如例2。
2.1.4 浮点数转换为整型
当浮点数转换成整型数据时,舍弃小数,不进行四舍五入,例如:
main()
{double i=15.99999;int j=i;printf("%dn",j);}//其输出为15。
因此,若需要计算结果尽可能高的精度,应避免此种类型的转换。
2.2 输入输出格式错误
这种错误会出现在格式输入与格式输出函数中。例如:
main()
{int i=2;printf("%f",i);}//会出现编译错误(数据类型不一致)
2.3 算术运算“/”、“%”与数据类型不匹配
例1 main()
{int i=7,j=2;printf("%dn",i/j);}//输出结果为3
例2 main()
{float i=12.45,j=6.3;printf("%dn",i%j);}//提示错误:非法地使用浮点数在main函数中
在例1中,程序的本来目的是想得到结果3.5,可是结果却是3,,是因为变量i和j都是int类型的,其结果也是int类型的,如果想得到3.5的话,就要将i和j都要强制转换为float类型;在例2中,之所以会出现系统提示错误,是因为运算符“%”左右两侧的数据类型都必须是int,但程序中两个变量却都不是int类型的,因此,想让系统不出错误,就必须将两个变量都强制转换为float类型。从上述两个例子来看,对于算术运算符“/”和“%”,一定要注意数据类型的匹配。
3 结论
在C语言中,多种数据类型之间的转换有它出现的必然性,也就是在某些情况下,数据转换是必须的,但应尽量避免出现将数据长的类型转换为数据短的类型、输入输出格式上的错误以及运算符数据类型不匹配等问题。
参考文献
[1]谭浩强.C程序设计[M].北京:清华大学出版社,2005:14-18.
[2]谭浩强.C++程序设计[M].北京:清华大学出版社,2004:36.
[3]谭浩强,张基温,唐永炎.C语言程序设计[M].北京:高等教育出版社,1992:87-88.
[4]Schildt H.C语言大全[M].戴健鹏,译.北京:电子工业出版社,1994:68-69.
[5]Schildt H.ANSI C标准详解[M].王曦若,李沛,译.北京:学苑出版社,1994:45-46.
[6]夏涛.C语言程序设计[M].北京:北京邮电大学出版社,2007:52-54.
[7]杨路明.C语言程序设计教程[M].北京:北京邮电大学出版社,2005:76-77.
一、横截面数据(Cross-sectional data)
1.横截面数据的概念、特点及其问题。横截面数据是指在某一时点收集的不同对象的数据。它对应同一时点上不同空间(对象)所组成的一维数据集合,研究的是某一时点上的某种经济现象,突出空间(对象)的差异。横截面数据的突出特点就是离散性高。横截面数据体现的是个体的个性,突出个体的差异,通常横截面数据表现的是无规律的而非真正的随机变化。即计量经济学中所谓的“无法观测的异质性”。在分析横截面数据时,应主要注意两个问题:一是异方差问题,由于数据是在某一时期对个体或地域的样本的采集,不同个体或地域本身就存在差异;二是数据的一致性,主要包括变量的样本容量是否一致、样本的取样时期是否一致、数据的统计标准是否一致。
2.横截面数据异方差性的检验与修正。异方差性的检验。对异方差的检验大多集中于线性模型情形,检验方法很多。主要的检验异方差性的方法有:图示检验法、等级相关系数检验法、戈里瑟检验(Glejser Test)、巴特列特检验、布鲁奇-培根检验(The Breusch-Pagan Test)、戈德菲尔德-匡特检验(The Goldfeld-Quandt Test)、沃特检验(Wald Test)、拉格朗日乘数检验、似然比检验、怀特(White)大样本检验等。这些检验方法在性能上各有优劣,互为补充,在具体操作时宜结合使用,相互验证,不应单凭个别检验结论做出歧视性或排他性的断言。
3.异方差性的修正。(1)已知Ω时使用加权最小二乘法(WLS)。对于线性回归模型y=xβ+ε,其GLS估计量为。考虑最一般的情况:,则Ω=;对原模型进行变换(y*=py,x*=px;其中p=Ω-1/2)并应用OLS进行估计得到加权最小二乘(WLS)估计量:,其中WI=1/WI。
(2)Ω含有未知参数的估计方法
①两阶段GLS法。首先估计OLS残差估计量。OLS残差,由于,可构造一个回归,。因此,近似地有,该回归模型表明可将OLS残差平方作为因变量以估计某些未知参数。如果得到Ω中未知参数的估计量,即可使用FGLS(Feasible GLS)对原模型进行参数估计,可得到一致的估计量。
然后把代入原模型的GLS估计量中得到:。
②最大似然估计(MLE)。考虑异方差的一般化模型,令,其中θ为Ω中未知参数的向量,是某个协变量zi的函数,。对数函数可变换为:
对该函数分别对βδ2、θ取偏导并求期望,可得到渐近有效的参数估计量。
二、时间序列数据(Time-series data)
1.时间序列数据的概念、特点及其问题。时间序列数据是指对同一对象在不同时间连续观察所取得的数据。它着眼于研究对象在时间顺序上的变化,寻找空间(对象)历时发展的规律。利用时间序列作样本时,要注意几个问题:一是所选择的样本区间内经济行为的一致性问题;二是样本数据在不同样本点之间不可比,需要对原始数据进行调整,消除其不可比因素;三是样本观测值过于集中,因而时间序列数据不适宜于对模型中反映长期变化关系的结构参数的估计;四是模型随机误差的序列相关问题。
2.时间序列数据序列相关性的检验与修正。(1)时间序列数据序列相关性的检验。计量经济学模型一旦出现序列相关性,如果仍采用OLS估计模型参数,则会产生与异方差类似的诸多不良后果:OLS参数估计量虽仍具有无偏性,但不具有有效性;变量显著性检验失去意义;模型的预测失效。关于序列相关性检验的主流的检验方法有三种:一是德宾-沃森(Durbin-Watson)型检验;二是冯-诺曼(Von-Neumann)比检验;三是逐次回归检验。其他的检验方法还包括有图示检验法、布罗施-戈弗雷检验、博克斯-皮尔斯检验等。
(2)时间序列数据序列相关性的修正。①已知Ω时的估计方法。A、广义最小二乘(GLS)估计法。如果Ω为已知,GLS估计量为,样本方差。对于AR(1)过程,,对原模型数据进行变换(y*=py,x*=px)后再次使用OLS方法对参数进行估计,估计结果已消除序列相关性。
对于高阶自回归过程的参数估计方法类似,但变换过程越来越复杂。同样地,对于高阶MA过程和ARMA过程均可通过GLS近似地估计,这里不再做详细介绍。
B、最大似然估计(MLE)。如果扰动过程的参数已知,AR(1)模型可使用最大似然方法进行估计。为得到正态分布扰动的似然函数,我们利用:。基于变换后的y*,x*(),对数似然函数为:
对函数求偏导即可得到参数β,的估计量。
②自回归条件异方差(ARCH)。异方差性通常与横截面数据相联系,而时间序列则一般地被认为是具有同方差性的。然而,恩格尔(1982)和克拉格(1982)研究发现时间序列模型中存在着一种异方差,其中预测误差的方差取决于后续扰动项的大小。恩格尔并因此创立自回归条件异方差(ARCH)模型以选择。该模型表述如下:
,其中ut是标准正态的。
而且,,以εt-1为条件,εt是异方差的。同时,恩格尔还给出此模型的对数似然函数:
。
然后通过四步FGLS进行估计:
1.运用OLS和所有可用的观测值将y对x回归得到b和e;
2.将对回归以获得a0和a1的初始估计,记[α0,α1]=a;
3.计算,然后计算渐近有效估计,其中dα为对(1/ft)和/回归的OLS系数向量。的渐近协方差矩阵为2(z’z)-1,其中z为此回归的回归量矩阵;
4.运用α计算ft,然后计算和。估计,其中dβ是etst/rt对xtrt回归的OLS系数向量。的渐近协方差矩阵为(w’w)-1,其中W是在此回归的回归量矩阵。
三、纵向数据(Longitudinal data)或面板数据(Panel data)
1.面板数据两种常用的估计方法。(1)固定影响模型(Fixed Effect Model)。固定影响模型也被叫做“虚拟变更模型”(Dummy Variables Model)。假设每个横截面样本都有各自的截距,我们可以用虚拟变量的形式来表达:
这里β0i是第i个横截面样本的截矩。欲准确地估计此模型中的参数,须分以下几步:
(1)首先求出变量在时间序列上的均值,即
(2)再求出变量的每个样本与其对应均值的差并设立新变量,即
(3)基于新变量建立模型,即,这里。
(4)计算虚拟变量的参数估计值β0i,即。
运用同样的估计步骤亦能够估计出假设时间段(样本)各有其截矩的面板数据模型的参数值,只须在第一步中改求变量在横截面上的均值,后三步则相似。
2.随机影响模型(Random Effect Model)。随机影响模型也被叫做“误差成份模型”,模型设定如下,这里误差项εti期望值为0,方差为。假设β0i为随机的、相互独立的变量,其均值为,方差为,则β0i可被写成:,这里误差项ηi期望值为0,方差为,且相互独立,cov(ηi,ηj)=0。而且还假定ηi与εti不相关,cov(ηi,εti)=0。即原模型可改写为
欲估计此模型的参数,可分如下几个步骤进行:
(1)首先运用虚拟变量模型来估计参数。假定时间段(样本)有相对固定的差异,可用虚拟变量来表示,即,可估计出参数值。
(2)将实际数据代入估计模型中以求得误差项,即
(3)计算出变量的均值,并将它们设为新变量,即
使用新变量设立回归模型()并运用OLS估计分析。
(4)利用上式模型估计结果求得其误差项,即
(5)计算校正系数,对原数据进行修正并设立新变量
利用这些修正的变量建立新的回归模型,即。利用OLS对此模型进行估计,即可得出最佳的、线性的无偏估计量。
Javascript有7种数据类型,包括5种原始类型(也叫原始值)number、Boolean、string、null、undefined和2种复合类型object、array,它们之间可以根据某种规则相互转换,《Javascript权威指南》列出了在Javascript中如何进行类型转换,
其中原始值之间的转换没什么可说的,记住就好了,我们要关注的是复合值(即对象)与原始值之间的转换。原始值转换成对象直接调用Object方法即可(null和undefined不可调用该方法),而对象转换成原始值呢?如空数组[]转换成数字为什么是0呢?
对象转换成原始值
对象转换成布尔值:所有对象转换成布尔值都是true,包括包装对象new Boolean(false)转换成布尔值也是true。
对象转换成字符串:如果对象有toString()方法,则调用这个方法,如果它返回原始值,将原始值转换成字符串后返回;如果对象没有toString()方法或调用toString()方法方法返回的不是原始值,则调用valueOf()方法,然后将valueOf()方法返回的原始值转换成字符串返回,如果valueOf()方法返回的还不是原始值,没救了,浏览器只好抛出类型异常的错误。
对象转换成数字:和对象转换成字符串过程类似,只不过先调的是valueOf()方法。
根据以上规则就可以知道为什么空数组转换成数字结果是0了:空数组先调用了valueOf()方法,返回了“”字符串,“”字符串是个原始值,再根据上面的表格,“”字符串转换成数字0。
隐式类型转换
来看一个例子:
“123” == 123
大家都知道结果是true,==运算符两边的操作数属于不同的数据类型,要判断是否相等,需要经过隐式类型转换成相同的数据类型才行。然而,是运算符左边的“123”转换成了数字123还是运算符右边的123转换成了字符串“123”呢?
规则是:
如果一个值是null,另一个是undefined,那么它们相等
如果一个值是数字,另一个是字符串,先将字符串转为数字再比较
如果其中一个值是true,将true转为1再比较,同理false转换成0再比较
如果一个值是对象,另一个是数字或字符串,则将对象转换成原始值再进行比较(日期对象转换成字符串,其它对象先尝试调用valueOf()方法再尝试使用toString())
其它不同类型的比较都不相等
显然上面的例子属于第二种情况,“123”被隐式转换为123了。
除了==运算符,诸如+、-、*、/、!、<、<=、>、>=等运算符两边的操作数类型不同时,都会发生隐式类型转换,还包括while()语句和if()语句内的条件语句,alert()语句会将()内的值隐式转换成字符串后再弹出。
“+”运算符
二元加法运算符“+”可以对两个数字做加法,也可以做字符串连接操作:
1 + 1// 2
“hello” + “world”// “hello world”
当二元加法运算符“+”遇到下面的运算时操作数会如何转换呢?试着想想答案再往下看
1 + true
“1” + true
1 + “1”
{} + 1
{} + {}
隐式转换规则:
如果其中一个操作数是对象,对象会转换成原始值:日期对象通过toString()方法转换,其他对象通过valueOf()方法转换,如果valueOf()返回值不是原始值再使用toString()方法转换,
在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串拼接。
否则,两个操作数都将转换为数字(转换不了的将转换为NaN),然后进行加法操作。
根据规则,以上的例子结果是:
1 + true// true转换为1,然后加法得出结果2
“1” + true// true转换为“true”,然后字符串拼接得出结果“1true”
1 + “1”// 数字1转换为“1”,然后字符串拼接得出结果“11”
{} + 1// {}对象调用toString()方法转换为字符串“[object Object]”,变成了“[object Object]” + 1,匹配第二条规则,1将转换为字符串“1”,然后字符串拼接得出结果“[object Object]1”
{} + {}// 自己想想过程吧
当“+”做为一元运算符时,会把操作数转换为数字(转不了的转成NaN)
“-”运算符
当“-”做为二元运算符时,会把操作数转换为数字(转不了的转成NaN)
当“-”做为一元运算符时,会把操作数转换为数字(转不了的转成NaN),同时改变运算结果的符合
比较运算符(“>”、“>=”、“<”、“<=”)
比较操作符的操作数可能是任意类型,然而只有数字和字符串才能真正执行比较操作,因此其它类型的操作数都将进行类型转换,具体规则如下:
如果操作数为对象,那么这个对象将转换为原始值:同上,日期对象通过toString()方法转换,其他对象通过valueOf()方法转换,如果valueOf()返回值不是原始值再使用toString()方法转换。
在对象转换为原始值后,如果两个操作数都是字符串,将依次比较每个字符串的Unicode大小。
在对象转换为原始值后,如果至少有一个操作数不是字符串,那么两个操作数都将转换为数字进行比较,如果其中某个操作数无法转换为数字,这个操作数将转换为NaN,比较结果为false。
“*”、“/”、“%”、“!”
“*”、“/”、“%”会把操作数转换为数字(转不了的转成NaN)
这个课程是为第二年的学生。经过前几个星期的学习,学生对视觉基本的基本界面,添加控件和修改控件属性,打印方法的形式已经初步掌握了视觉基本编程已经初步了解。但是对于视觉基本语法规则和程序的基本元素都比较陌生,而且不明白其程序代码的意义。
二,教材分析
1,本节的主要内容和本章的状态
本节介绍的知识点比较简单,都是概念。但对于这些奇怪,无聊的纯概念性知识,学生更难以接受。但在实际应用中,这种知识是非常重要的,而在毕业考试中,这部分内容检测频率很高。因此,本节的内容,无论是在本章还是学生之后,生活都有非常重要的作用。2,教学重点,困难
[关注]数据类型的分类,了解常量,变量的作用 [难度]区分不同的数据类型
三,教学目标 1,知识和技能
可以区分常用的数据类型和表示 方法;理解常量,变量含义和效果 2,工艺和方法
通过帮助小明完成一系列的活动,让学生从实际到理论知道不同数据类型的特点
常量变量,可以区分不同的数据属于数据类型,知道常量变量的含义和功能。3,情绪态度和价值观
通过帮助小明收集信息活动对数据进行分类,并根据数据类型确定数据属于数据
类型,培养学生的观察和判断,增强对编程思想的理解。
四,教学过程设计
1,教学内容组织与演示
通过帮助小明完成信息和一系列活动,让学生在活动中获得新知识。2,教学过程
教学链接
教师活动
学生活动
设计计划
创建情境
(5分钟)
1,创建小明收集的学校运动员信息不会分类,现场,给定
很多数据供学生分类。
2,总结学生分类的结果,提出数据类型的概念。
老师:我们可能基于名字,学生人数,评估分数,是否
分类学校团队。在电脑上,系统也是使用这一面
法律对巨大的数据进行分类。而类别的分类是名称,学号,电话等,统一为数据类型。
思考,告诉自己的分类结果
仔细听
创造一种局面,让学生联系生活。
解释新课程(20min)
介绍常用的数据类型
老师:
①数值数据:我们分为整数和长整数,单精度和双精度。整数(整数)指的是-32768?32767范围内的间隔,例如,350,-20。这里要注意的是整数的取值范围需要知道。(这时可以要求学生了解情况的掌握情况)。单精度是单值
-3.402823x10 ^ 38?3.402823x10 ^ 38实数。我们可以理解,只要有小数点就可以归零单精度型。长整数(长)和双(双)我们可以看出它的值比较大,天文数字,计算天体之间的距离,当我们 使用它。因为long整数和double的值较大,而且我们学习vb不常用,所以这里我们可以知道long和double精度的英语和可以解决。长整数(long)是一个较大的整数,double precision是一个较大的小数位数。
②字符串类型:什么是字符串类型?学生,电话,地址可以把它放到字符串类型。在我们的研究中,我们可以简单地认为有双引号是字符串类型。好的,我们强调什么类型的字符串?双引号是字符串类型。
③boolean:boolean(boolean)用于逻辑判断。布尔类型不是由数值数据组成。它只有两个值正确和错误,即true和flase。例如,如果3大于2,系统将输出true。相反,它会输出flase
引入常量
老师:在系统中我们把程序在运行的过程中总是将固定数据称为常数。我们可以告诉我在小明收集的学校运动员信息情景,哪些数据不会改变?属 在字符串类型名称中,属于分数的数值类型,学校编号,属于布尔类型的学校团队这些固定数据是否是常数。我们看一下以前的登录页面的程序,欢迎,登录系统这些都是我们运行后修复的。所以这是我们的常数。
引入变量
老师:所以有自然有变量的变量。什么是变量?有同学的例子吗?在数学中,这个x y = 3,我们的x,y可以有很多不同的值。例如:x = 1,y = 2;x = 2,y = 1;x = 1.5,y = 1.5。
在计算机中,这个值可以改变我们称为变量的量。
仔细听,并积极回答问题
教授本课的知识
练习合并
(5分钟)
回到学校运动员信息场景的肖明集合,向学生强调什么数据是不变的,变量的含义,让学生指出哪些数据属于哪种数据类型。
老师:好的。我们已经知道什么是常量,变量。在这里我们回到身上附着的小明继续帮助解决他的问题。首先 小明,5,学校团队输出是否真实。在程序运行中始终固定的数据是常量。变量是在运行程序的过程中可以更改的变量。如同x y = 3,x和y具有许多值。
然后,我们学习了通常的数据类型,并知道不同的数据类型。这里我们根据分类的结果,我们分成名字,学生人数,电话,评分,是否是学校团队。然后我们总结下面的小明数据:名字数据是在程序中哪种数据类型?
程序的数据类型是什么?
电话数据属于什么数据类型? 分数分数数据是在程序中哪种数据类型?
学校团队的数据是在程序中哪种数据类型?
想想和回答问题
据
2018年1-6月份,全国固定资产投资(不含农户)297316亿元,同比增长6%,增速比2017年底回落1.2个百分点。其中,民间固定资产投资184539亿元,同比增长8.4%,增速比2017年底减少2.4个百分点;对全部投资增长的贡献率达81.5%,拉动投资增长4.9个百分点。
2018年1-6月份,民间固定资产投资占全国固定资产投资的比重为62.1%,比2017年底增加1.7个百分点。
11个行业大类看,2018年1-6月份固定资产投资,文化/体育和娱乐业等7个行业投资增速高于全国水平,水利/环境和公共设施管理业等2个行业投资增速低于全国水平,建筑业等2个行业没有公开数据。民间投资方面,文化/体育和娱乐业等6个行业投资增速高于全国水平,公共管理/社会保障和社会组织等5个行业民间投资增速低于全国。同2017年底相比,2018年上半年采矿业等4个行业投资增长加速,水利/环境和公共设施管理业5个行业投资增速出现下降;采矿业等3个行业民间投资增速加快。
气象雷达原始回波数据包含了大气层云雨生消演变过程的动态信息, 反映了云雨的变化轨迹, 这些正是自然长年累月不断演变的痕迹。痕迹的生消是瞬间、不可逆不可重复的, 因此保存含有这些信息的雷达原始回波数据对于研究大自然的演变规律尤为重要[1]。雷达原始回波数据的数据量多、文件大, 利用有效的压缩算法对雷达的原始回波数据进行无损数据压缩具有非常重要的意义。
2 压缩算法的设计原理
文本类型雷达原始回波数据文件中含有较丰富的换行符和回车符, 这些都是冗余信息。根据这个特点, 可以首先利用位图压缩算法对这两种字符进行压缩。雷达原始回波数据的文本文件中包含“0-9”、“-”、空格符以及换行符共13个字符, 它们对应的ASCII编码如表1所示。通过观察可知, 字符“0-9”的ASCII编码连续且均以特征位“3”开头, 而其它三个字符 (“-”、空格符和换行符) 的ASCII编码则不具备这个特点。为了对该文本文件进行有效压缩, 首先对这三个字符按照表1中约定的值进行重新编码, 即:将“-”、空格符和换行符分别编为0x3A、0x3B和0x3C。这样, 经过重新编码后的值在0x30-0x3C的范围内, 且13个字符的编码均以特征位“3”开头, 如表1所示。现在, 就可以采用半字节压缩[2]的方法对重新编码后的文本数据进行压缩, 即:首先将每个字符的特征位压缩掉, 然后将两个字符对应的半字节压缩存储到一个字节中。最后, 对经过半字节压缩处理后的文本数据再进行Huffman压缩[3], 从而构成了位图压缩+半字节压缩+Huffman压缩算法, 以下简称为b Map-HalfB-Huf算法。
3 压缩过程
在b Map-HalfB-Huf算法的压缩过程中, 用0标识换行符和回车符, 用1标识其它字符。具体压缩过程可表述如下:打开源文件, 按顺序每次读取一个字符, 判断该字符是否为换行符或回车符, 如果是, 则将位图信息的相应位置0, 并丢掉该字符;若不是, 则将位图信息的相应位置1, 并将该字符存储到缓存中。此外, 每读取8个字符, 就将生成的位图信息及字符信息依次存储到缓存中。对整个文本文件的数据进行位图压缩完毕后, 然后将按顺序每次读取字符信息中的两个字符, 判断读取的两个字符数值是否均在0x30-0x39的范围之内, 若不在, 则首先对照表1进行编码, 然后再进行半字节压缩处理;若在, 则直接进行半字节压缩处理。半字节压缩过程是:分别将两个字符的低4位取出, 丢掉高4位的特征值位“3”, 再将高地址字符低4位作为新生成字符的高4位, 而低地址字符的低4位字符信息作为新字符信息的低4位信息, 这样就将两个具有相同特征值位的字符信息压缩处理成一个字符信息。对进行半字节压缩后的文本数据再进行Huffman压缩, 并将源文件的大小、压缩文件的大小及压缩后的信息依次存储到压缩文件中, 压缩过程完毕。b Map-HalfB-Huf算法的压缩流程如图1所示。
4 解压过程
压缩是解压的逆过程, 可以按照压缩的逆序进行。在压缩文件中存储了源文件大小和压缩文件大小, 目的是为了保证对压缩文件能够进行正确解压。b Map-HalfB-Huf算法的解压过程如下:打开压缩文件, 首先, 读取前两个整型数据, 这两个整型数据分别表示源文件的大小和压缩文件的大小。然后, 读取压缩信息, 对其进行Huffman解压, 得到半字节压缩信息;然后进行半字节解压, 半字节解压缩的具体过程是:首先将解压的字符信息的高4位与低4位信息分离, 然后将低4位信息作为生成的低地址字符的低4位信息, 而分离出的高4位信息则作为另一个生成字符的低4位信息, 并将此字符存储在前一字符的高1的地址中, 两个字符信息的高4位均用特征值3进行填充, 半字节解压完成。
将半字节解压后的数据信息再按照表1进行译码, 若字符值不在0x30-0x39之间, 则须将字符进行译码操作, 完成译码之后的数据进行位图解压, 恢复原始文件。
5 实验结果
实验数据为实测的雷达原始回波低仰角的I、Q通道混合的文本类型数据, 该文件的大小为3187KB, 以下称为混合数据文件。将I、Q通道数据分离后的文件大小分别是1597KB和1591KB, 以下分别称为I路数据文件和Q路数据文件。压缩的实验结果见表2。采用混合压缩文件将设计的混合压缩算法与通用的压缩算法及压缩软件进行了性能比较, 比较结果见表3 (其中Arith-0表示自适应算术压缩算法, Arith-3表示3阶自适应压缩算法) 。
从表3的压缩结果可以看出, Arith-3算法具有最高的压缩因子, 但其压缩时间和解压时间都比其它算法要长得多。除此之外, 压缩因子最高的是本文的b Map-HalfB-Dhuf算法, 其次是LZW算法;压缩时间最短的是Huffman算法, 其次是b Map-HalfB-Dhuf算法, 但两者差别很小, 仅0.094s;解压时间最短的是WinZip压缩软件, 其次是WinRar压缩软件, 再次是LZW算法及Huffman压缩算法, 然后是本文的b Map-HalfB-Dhuf算法。
由于本文对雷达原始回波进行压缩不仅要求高的压缩因子, 还需要算法有较短的压缩时间, 这样才会在有效的时间内存储或者传输更多的雷达原始回波数据。因此从压缩因子和压缩时间上对压缩算法的性能进行评价, 可以得出:b Map-HalfB-Dhuf算法是以上所有算法中压缩性能最高的算法。从而说明采用b Map-HalfB-DHuf算法对文本类型雷达原始回波数据文件进行压缩是非常有效的。
6 总结
本文主要是对实测气象原始回波文本类型数据进行无损压缩算法研究, 根据文本类型回波数据文件空白字符较丰富及文件仅由13个字符构成的特点, 并根据此特点设计了文本类型的混合压缩算法。将设计的通用压缩算法对实测数据进行了压缩解压实验, 并与通用压缩算法及通用压缩软件WinRar、WinZip的压缩性能进行了综合比较, 比较结果表明设计b Map-HalfB-DHuf算法压缩性能优于通用压缩软件及算法, 可见设计的此压缩算法对文本类型气象回波数据压缩效果是非常显著的。
摘要:本文对气象雷达原始回波文本类型数据进行无损压缩算法研究, 根据文本类型数据的特点, 设计了位图压缩+半字节压缩+双Huffman压缩的混合压缩算法。采用设计的混合压缩算法对实测数据在C环境下进行压缩和解压实验, 结果表明:混合压缩算法的压缩性能优于通用压缩软件WinRar、WinZip的压缩性能。
关键词:无损数据压缩,位图压缩,半字节压缩,混合压缩
参考文献
[1]王立华, 蓝天飞.使用压缩算法实现雷达原始资料共享的技术方法[J].湖北气象.2003, 32-34.
[2]袁玫等.数据压缩技术及应用[M].电子工业出版社:1995.
[3]吴乐南.数据压缩[M].电子工业出版社:2000.
【关键词】灾难片;亚类型;受众心理;视觉奇观;生命价值
【作者单位】万鹏,平顶山学院。
灾难片是一种成熟的类型电影,其选材往往以人类社会或者大自然爆发的灾难(如地震、海啸、飓风等)为背景,并以灾难背景下的末日拯救为主要的故事线索,逼真的场景设计加上曲折震撼的情节设计,在创造独特视觉奇观的同时也在探讨世界末日背景下人类生存与拯救的话题。人类借助灾难片进行自我审视,“在灾难片中,观众不仅体会到场面的悲壮与刺激,还通过对影片中灾难发生瞬间人们本性表现的观察,从而对自身生存环境和生命意义产生反思和探索”[1]。
灾难片在十多年中形成一股创作热潮,成为商业电影的一个重要类型。尤其近3年,好莱坞上映了十多部灾难片,如《空中营救》《哥拉斯》《不惧风暴》《侏罗纪世界》《末日崩塌》《灾难的战争:洛杉矶之战》等。不仅好莱坞,国内也掀起了不小的灾难片创作热潮,最近几年有《唐山大地震》《五颗子弹》《超强台风》《救火英雄》《蒸发太平洋》等灾难片上映。这些灾难片呈现独特的亚类型倾向,在给观众带来震撼的视听体验的同时,还通过影像满足了观众的审美需求,使观众得到情感上的宣泄,最终引导观众在观影过程中重新审视与探索生命的价值。
一、人类体验与灾难片的类型
类型化叙事要求同一类型影片在叙事与主题建构上具有某些共通的特征。成熟的类型电影特征明显,基于叙事的需要,分化为若干亚类型。比如灾难片,从故事架构的背景看,灾难片可以分为自然灾难片、生物灾难片、外星入侵灾难片、交通事故灾难片、病毒扩散灾难片等亚类型。这些亚类型影片蕴含着人类文明史的积淀,也反映了人类成长历程中的各种灾难。
1.自然灾难片
自古以来,人们在征服自然的同时也在感受自然的巨大力量,美学中的壮美意象就是来自人类对大自然力量的敬畏。人类文明史上,洪水、地震、火山等自然灾害频发,当面临这些灾难,人类往往无处可逃,自然灾难片也就成了灾难片的主要类型。在此类电影架构中,灾难的来源主要是某些自然力量,影片主要传达的是自然力量的强大以及人类对自然力量的恐慌。以《后天》《2012》《超强台风》等影片为例,这些电影的叙事架构和最初情节会表现各种自然征兆,引起观众的好奇心和猜测,为后期灾难的发生做铺垫。铺垫完成后,影片开始为观众呈现惊心动魄的灾难画面,演绎人类在灾难中的自我拯救,在表现人类脆弱和渺小的同时传达人与人之间的真情和人类对自我力量的信任。
2.生物灾难片
人类的生存空间,实际上是在与其他生物的争夺中建立起来的。由于生理特征不同,很多生物比人类更高大凶猛,在早期的人类生存环境中,周围的各种生物时刻威胁着人类的生存。虽然随着时代的发展,人类逐渐掌握了工具,生活圈与其他动物隔离开来,凶禽猛兽要么消失于茫茫野外,要么被人类关进动物园成为玩物,各类生物对人类已经不构成直接的威胁。但是,人类对于这些生物某些超越人类的力量依然有着天然的惧怕心理,生物灾难片正是这种心理的产物。生物灾难片以自然生态为背景,只不过制造灾难的不是大自然而是具体的某种生物。以《哥拉斯》《侏罗纪世界》《狂蟒之灾》为例,极具破坏力的生物登上银幕,肆意侵占人类的生存空间并残杀人类,这些生物要么是自然界中的独特存在,要么是人类生物技术所创造的生物,它们迅速发展,以至于人类无法控制。不过,在这类灾难片中,经过艰难曲折的抗争,人类永远是最终胜利者。通常此类影片悬念感比较强,畫面也比较血腥。
3.外星入侵灾难片
人类文明的发展,也是人类知识不断扩充的过程,到今天可谓到了一个知识大爆炸的阶段。然而我们知道得越多,也意味着我们不知道的越多,关于自然界和宇宙,人类还有很多未解之谜。这些未解之谜,对人类来说,也是很多的不安定、不安全因素。其中最具代表性的,便是人类对外星文明的探索。而探讨外星文明可能给人类带来的威胁,也是灾难片的重要关注内容。此类灾难片具有很强的科幻背景,其所幻想的内容大多数是在外星人的入侵之下人类的自我拯救,《独立日》《世界大战》为此类影片的代表。宇宙中是否有智慧生物仍是未解之谜,但人们相信有外星生命存在,并在影片中赋予他们超出人类的智慧和能力。在此类影片中,地球人总是处于相对劣势的地位,但影片结局大多不错,虽然科学技术落后,但是人类总能够依靠智慧,以人性的力量赢得非公平对抗的胜利。在这类影片中,外星人的造型和他们拥有的特异功能,以及影片塑造的环境神秘感是重要的看点。
4.交通事故灾难片
文明的发展在很大程度上改善了人类的生活水平,越来越多的科技产品运用到人们的生活中,使人们的生活越来越便捷。然而这些科技产品很可能是一把双刃剑,在为人们生活带来便利的同时,也给人类制造了新的灾难。尤其是航海、航空两大产业在历史上曾经多次出现重大灾难,更是加深了人们对交通事故的焦虑。此类灾难片的代表为《泰坦尼克号》,作为世界电影史上的经典作品之一,该片无疑在各方面获得了巨大的成功。此类型的灾难片主要讲述飞机或船只等遇到特大事故过程中发生的故事。在巨大的损失和人员伤亡的背景下,在恶劣环境中生存下来的幸存者既要战胜灾难,也要战胜人性中的弱点。2016年2月8日在国内上映的合拍片《蒸发太平洋》就是这类故事架构。
5.病毒扩散灾难片
人类与各种疾病的斗争史与人类的历史一样漫长。14世纪的欧洲,有一半的人死于黑死病;16世纪,十分之九的美洲土著死于殖民统治者所带来的各种传染病;1803年,拿破仑的军队有29000人死于黄热病感染;第一次世界大战结束后,西班牙流感在几个月内带走了2000万人的生命。直至今天,SARS、疯牛病、禽流感、艾滋病等疫病依然在威胁人类的健康,此类病毒入侵灾难片反映的正是人类对疾病的焦虑。以《我是传奇》《生化危机》等影片为代表,此类灾难片主要展现人类在疾病突发期产生的恐慌,人类与病毒做斗争的艰苦,以及人类攻克难题的毅力和决心。此类影片关于各种病毒来源的交代也值得我们关注,除了自然界中已经存在的病毒,很多疾病是有人蓄意制造的,影片往往带有极强的阴谋论。
nlc202309090515
我们能够看到,无论哪种类型的灾难片都是将人类对灾难的苦难意识转化为娱乐精神,以人类对未来、对个人命运的忧思为消费对象。作为商业电影,制片方往往选择时下最热门的灾难话题作为题材,并在影片的故事叙事中投射创作者的独特思考,将对人与自然、人与动物、人性与人类文明关系的探讨引入观众的思考范畴。
二、观看灾难片的受众心理
灾难片在电影市场中广受欢迎与其独特的叙事手法密不可分。其剧情离奇曲折,扣人心弦,极具戏剧张力;在冲突架构上,其往往制造紧张激烈的冲突,并设定已知或未知的对立方;在视听语言上,其建构具有刺激性视觉效果的影像奇观;在主题内涵上,其对人性魅力做出高度赞扬。这些元素有助于灾难片超越种族,跨越国界,成为国际化的类型电影。而成熟的亚类型影片则可以依靠多元的选材与表述形态从不同层面影响受众的观影心理。本文拟从以下几个方面分析灾难片受欢迎的原因。
1.建构视觉奇观
震撼的视听效果无疑是灾难片最具有感染力和吸引力的特征之一,“灾难情景复原”将观众对灾难的好奇与想象转化为具体内容,通过运用电脑特技,呈现刺激恢宏的场面,使得观众的好奇心得到极大的满足。可见,从灾难片类型电影产生的最初,视觉奇观的建构就发挥了重要的作用。
以《2012》为例,这是好莱坞灾难片的集大成之作,其利用电脑三维特技将代表人类文明的诸多建筑的毁灭情景呈现在人们眼前,这些影像给人们带来强烈的视觉震撼。我们的生命有限,但我们的求知却是无限的。如何在有限的生命之内尽可能多地去感受、去经历,是生命的本真意义之一。灾难情景对于大多数人来说可能不会真正经历,但灾难电影却给人们创造了种种想象的可能。随着电影制作技术的进步,灾难片所创造的世界越来越逼真,极大地满足了观众对灾难的身临其境感的需求,在电影的造梦机制中,观众“入梦”并与人物同呼吸、共命运。
2.观众求知探索欲的满足
我们知道得越多,我们不知道的也就越多。当今社会,地球村已形成,人们之间的联系变得越来越紧密,因此,强大的求知欲望也表现在人们对未知领域、未知地域的探索上。“正是因为有着求知欲与超越自己存在的梦想,支撑人艰辛地活在这个世界上,并活出了精彩。”[2]近些年自然灾害频繁发生,世界末日流言盛行,不断地激发人们对这些现象的探索欲望。灾难片所建构的场景,在留给观众思考的同时也演绎了不同的人性选择。比如《泰坦尼克号》中,当巨轮要沉没的时候,很多人只顾自己逃命,但船员却给了妇女与儿童率先逃离的机会;还有很多人坦然地面对将要到来的死亡,一位小提琴手泰然自若地演奏,一对老夫妇并肩躺在床上紧握着手,等待死亡的降临。
灾难电影对观众求知欲的满足是多方面的,既有剧情和视觉效果带来的满足感,也有丰富多彩的人性表现带来的满足感。灾难片的观影体验中充满了各种未知,带给观众期待之外的“人类经验的极限”[3]。
3.唤醒忧患意识
人类的忧患意识是人类生存的重要保证。正是因為忧患意识的存在,人类才能在与灾难的无数次斗争中艰难地存活下来。自然界中灾难频繁,灾难片在一定程度上唤起了人们对自然的原始敬畏。灾难的产生有些具有现实可能性,比如交通事故、地质灾害、气象灾害、病毒肆虐等,另外一些只是想象,比如小行星撞击、外星人入侵等,但这些灾难总是和人类的某种担忧有关,是建立在科技基础之上人类对未来的忧虑,具有假设性和虚拟性。
人对死亡的恐惧和对有限生命的眷恋是灾难片的基本主题。在灾难片中,人们心里充满对未知的恐惧,对人类存在之外因素的不安。因此在故事架构中,“人们通过记录灾难、考量灾难、规避灾难来反思历史,其中不乏血的教训和深刻的警醒,给予我们重要的启示”[4]。灾难片在表达人类内心深处的恐惧与不安的同时,完成历史反思与人类精神的自我净化,并使人们从中获得战胜困难的勇气。
4.对人类自我力量的信心
在灾难来临的背景之下,在人类自我拯救的过程中,人类是否能够战胜灾难,完成自我拯救?很多灾难片都是从这些疑问开始的,影片的回答也是肯定的,那便是人类能够完成自我拯救,这是电影在达成观众的期待,满足观众的情感需求。通过观看灾难片,观众在影院中模拟体验了真实的经历,从而树立面对灾难的信心。
在灾难电影的观影过程中,总会有一些问题伴随着我们,“当突如其来的天灾摧毁了我们的家园,夺去了我们亲人的生命,粉碎了我们对美好未来的期待,我们是否还有勇气战胜一切?在电影《泰坦尼克号》中,杰克把生的希望留给了露丝,牺牲自己拯救露丝,在生命的最后一刻,他所要求的只是露丝承诺永不放弃”[5]。《2012》中,主人公克服重重困难拯救了自己的家人,登上了挪亚方舟。每一部灾难影片都昭示世人:灾难可能会摧毁一切,但是人们的爱却能够拯救一切。在对爱的昭示中,人类对自我力量的信任可见一斑。
5.英雄主义情绪
英雄是具有理想又能坚持行动的化身,“英雄也是推动历史不断前进、社会不断发展、人性不断完善的力量源泉”[6]。基于这样一种英雄观,灾难片为我们创造了一个又一个的英雄形象,这些英雄形象成为当代年轻人崇拜和模仿的榜样。普通人的英雄梦,也在这些“英雄叙事”的电影中得到了满足。在这类影片中,不管是地质灾害、气象灾害,抑或是人为所带来的各种危机,总会有一个英雄人物出现,完成使命,拯救人类。
任何一个人都有可能成为英雄。《恐怖地带》中的英雄人物是一位科学家,在《彗星撞地球》中,航空员是英雄。不同职业的英雄在危难面前做出了自己的选择,他们是勇气和正义的化身,他们的出现往往可以平息人们的恐慌,使影片中的故事情节顺利过渡,同时契合了观影者的心理,使观众对影片中的个人英雄主义发出赞叹。
此外,观看灾难片还能使人们产生一种庆幸感。人们在观看灾难电影时,往往因为置身事外而庆幸,感恩目前的美好生活,这也是灾难片观影的重要心理动机。在电影的造梦机制中,灾难片不可思议地模拟了灾难下的生命体验,使观众获得一种特殊的审美愉悦感。可见,灾难片作为一种成熟的类型电影在反映人在灾难情境下特殊生活状态的同时,体现了丰富的影像价值和社会意义。
[1]张琳. 灾难片的叙事背景和发展因素[J]. 电影文学,2011(10).
[2]王家东,周仲谋. 从梦想到救赎——科幻影视剧的人类情感折射[J]. 成都理工大学学报(社会科学版),2010(1).
[3]罗伯特·麦基. 故事——材质、结构、风格和银幕剧作的原理[M]. 周铁东,译,北京:中国电影出版社,2001.
[4]桑丘. 国外灾难题材图书掠影[J]. 出版广角,2008(7).
[5]宾主. 论灾难影片中的情感元素[J]. 电影评介,2007(17).
[6]李启军. 英雄崇拜与电影叙事中的“英雄情结”[J]. 北京电影学院学报,2004(03).