为什么C语言整型常量十进制形式的类型与八进制、十六进制的不一样?
展开全部
C语言标准对整型常量的类型有这样的描述:如果没有后缀且是十进制形式的,那么它的类型根据其值的大小可能为int、long、unsigned long;如果为没有后缀且是八进制或十六进制的,根据值的大小可能为int、unsigned int、long、unsigned long。
我想问,对于十进制形式的整型常量的类型为什么不经过unsigned int,直接从int跳到long;按理说它应该像八进制与十六进制一样,从小到大逐一遍历选取。
注意:这里说的类型是指原来的类型,不是指在表达式中转换提升后的类型。
这个问题可以算勉强解决了:为什么十进制形式不遍历unsigned int,它的类型遍历是从int、long再到unsigned long;在此总结多日来查阅参考得出的可能最主要的原因:(减少在移植时出问题)
首先,当无符号类型与长度相同的有符号类型一起运算时,其结果类型对C语言来说是无法预料的,也就是说结果的类型将有具体的实现;为什么呢?是这样的:
C语言规定:较长类型的整数至少要占有较短类型整数一样的空间,但它们可以占有一样大小的空间,这取决于具体的实现。
因此当无符号类型与有符号类型运算时,比如,unsigned int与long int,当它们被规定为长度相同,那么结果是什么类型,仅从语法上来说,不能确定结果的类型,因为不知道一个unsigned int的数long int能不能装的下,如果装的下则在类型转换时将unsigned int转换成long int,结果类型为long int,装不下则将long int、unsigned int转换unsigned long int,结果类型为unsigned long int,所以在考虑到移植性时,应尽可能的用有符号类型int、long,这样不管在哪种环境下,实现在语言中就可以确定其类型,而且无符号类型的表数范围大于有符号类型,在运算中一般要将有符号类型转换成无符号类型,而这种转换要比反向转换复杂的多,占用更多的计算时间,显然选用unsigned int的弊大于不用unsigned int,不选用unsigned int的利大于选用unsigned int。
语言设计者,在考虑到C程序的空间利用率、时间效率、移植性,作出一个好的折中(在设计领域有句话:一个好的设计取决于一个好的折中):
在尽量减少空间浪费的情况下,提高程序的运行效率和通用性。而这两点对于任何程序来说都是衡量的最主要标准。而空间可以在物理上扩大,这是必然趋势,效率与通用性则只能在程序中提高,虽然也可以提供更快的处理器,但这显然是种鲁莽的想法。
对了,最后的unsigned long是在不得已的情况下选取的,因为在C99以前没有提供比它更大的整数类型。
我想问,对于十进制形式的整型常量的类型为什么不经过unsigned int,直接从int跳到long;按理说它应该像八进制与十六进制一样,从小到大逐一遍历选取。
注意:这里说的类型是指原来的类型,不是指在表达式中转换提升后的类型。
这个问题可以算勉强解决了:为什么十进制形式不遍历unsigned int,它的类型遍历是从int、long再到unsigned long;在此总结多日来查阅参考得出的可能最主要的原因:(减少在移植时出问题)
首先,当无符号类型与长度相同的有符号类型一起运算时,其结果类型对C语言来说是无法预料的,也就是说结果的类型将有具体的实现;为什么呢?是这样的:
C语言规定:较长类型的整数至少要占有较短类型整数一样的空间,但它们可以占有一样大小的空间,这取决于具体的实现。
因此当无符号类型与有符号类型运算时,比如,unsigned int与long int,当它们被规定为长度相同,那么结果是什么类型,仅从语法上来说,不能确定结果的类型,因为不知道一个unsigned int的数long int能不能装的下,如果装的下则在类型转换时将unsigned int转换成long int,结果类型为long int,装不下则将long int、unsigned int转换unsigned long int,结果类型为unsigned long int,所以在考虑到移植性时,应尽可能的用有符号类型int、long,这样不管在哪种环境下,实现在语言中就可以确定其类型,而且无符号类型的表数范围大于有符号类型,在运算中一般要将有符号类型转换成无符号类型,而这种转换要比反向转换复杂的多,占用更多的计算时间,显然选用unsigned int的弊大于不用unsigned int,不选用unsigned int的利大于选用unsigned int。
语言设计者,在考虑到C程序的空间利用率、时间效率、移植性,作出一个好的折中(在设计领域有句话:一个好的设计取决于一个好的折中):
在尽量减少空间浪费的情况下,提高程序的运行效率和通用性。而这两点对于任何程序来说都是衡量的最主要标准。而空间可以在物理上扩大,这是必然趋势,效率与通用性则只能在程序中提高,虽然也可以提供更快的处理器,但这显然是种鲁莽的想法。
对了,最后的unsigned long是在不得已的情况下选取的,因为在C99以前没有提供比它更大的整数类型。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询