c语言和java语言数据类型的取值

来源:互联网 发布:图像识别算法matlab 编辑:程序博客网 时间:2024/05/19 06:51

在面试时有被问到,最基本的问题,我却不是很清晰,所以事后特意去搜索了一下,将结果整理如下:

不同数据类型所表示的取值范围取决于他所占的内存空间的大小,8位为一个字节

C语言中并没有明确规定数据类型的取值范围,在不同位数的操作系统中,同一数据类型可能会占不同长度的内存空间,自然也就会有不同的取值范围。C语言数据类型表示整理如下

16 位系统                                          unsigned 取值范围(忽略正负)                                 signed取值范围(不忽略正负)

char        1字节(8位)               0~ 2^8-1 (无符号位2进制数的最大值)                                    -2^7~2^7-1(-128~127)

short       2字节(16位)                            0~  2^16-1                                                                       -2^15~2^15-1

int           2字节(16位)                               0~   2^16-1                                                                       -2^15~2^15-1

long        4字节(32位)                               0~  2^32-1                                                                        -2^31~2^31-1

32  位系统                                                    

char        1字节(8位)                                 

short       2字节(16位)                             

int           4字节(32位)

long        4字节(32位)

long long 8字节(64位)

64 位系统

char        1字节(8位)

short       2字节(16位)

int           4字节(32位)

long        8字节(64位)

long long 8字节(64位)

通过上面16位系统不同数据类型的取值范围,很轻松的就能够求出其他不同位数操作系统的不同数据类型取值范围,只要知道了该数据类型在当前位数操作系统所占的内存字节长度,就可以很容易的推出取值范围,usigned为 0~2^位数-1,signed为

-2^(位数-1)~2^(位数-1)-1,这里简述一下取值范围的求法

signed需要占用一个符号位来表示正负,而我们所用的机器大多采用补码表示法,以8位的数据类型为例

对于正数,符号位为0 ,和原码一样,对于负数,符号位为1,能取到的最小值为10000000,

将非符号位按位取反为11111111,然后+1 ,为1100000000,表示的数为-128

对于java语言,数据类型所占内存是固定的,如下

boolean    1bit(位)           

byte           8bit               取值范围的算法和c语言中signed数据类型一样(java 语言数据类型一般都是有正负的)

char          16bit

short         16bit

int             32bit

long          64bit

float          32bit                     1.4E-45 ~   3.4028235E38                                    

double     64bit                     4.9E-324~1.7976931348623157E308 

 浮点型的数据类型的存储分为符号位,阶码,尾数,算起来实在是蛋疼,java与c语言有些区别,我们不必要具体的求算,只需要记住浮点的取值就好了!                   

在学校学习编译原理时,自己只是一知半解,能过且过,现在想想,实在是不应该,这些东西可能对实际编写代码意义不大,然而多学一些相关知识总是好的,可惜这么简单的道理我当时却没想通,唉!



0 0