c语言基本数据类型所占的位数 您所在的位置:网站首页 c语言中int占几位 c语言基本数据类型所占的位数

c语言基本数据类型所占的位数

2024-06-24 07:18| 来源: 网络整理| 查看: 265

1.C++的short、int、long和long long类型通过使用不同数目的位来存储值,最多能够表示4中不同的整数宽度。C++提供了一种灵活的标准,它确保了最小长度(从C语言借鉴而来),如下: 1. short 至少16位 2. int 至少与 short 一样长 3. long 至少 32 位,且至少与 int 一样长

4. long long 至少64位,且至少与 long 一样长 (此类型为 C++11 新增,旧的编译器可能不支持)

2.一般而言,short类型为半个机器字(word)长,int类型为一个机器字长,而long类型为一个或两个机器字长(在32位机器中,long类型和int类型的字长通常是相同的),所以它们的表示范围不同。

3.short 的最小表示范围和 int 一样,都是-32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。类似地,2 的 20 次方记作2^20 ,以此类推。注意:C 语言中 2^15 并不表示 2 的 15 次方,为了书写方便,我们姑且这么表示。

long 的最小取值范围是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到 (2^31 - 1) 。unsigned short的最小表示范围和unsigned int 一样,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值范围是 0 到 4294967295(2^32 - 1)。

long long的最小取值范围是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到 18446744073709551615(2^64 - 1)。

 目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具体某个编译器到底使用多少位来表示这些类型。

4.float与double的范围和精度

1. 范围   float和double的范围是由指数的位数来决定的。   float的指数位有8位,而double的指数位有11位,分布如下:   float:   1bit(符号位) 8bits(指数位) 23bits(尾数位)   double:   1bit(符号位) 11bits(指数位) 52bits(尾数位)   于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。   其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。   float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

2.  精度   float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。   float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;   double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

-----------------------------我是分割线----------------------------------------------------------

下面举例看下4.5在计算机中存储的具体数据:                     Address+0                 Address+1               Address+2            Address+3 Contents        0x40                         0x90                           0x00                      0x00     接下来我们验证下上面的数据表示的到底是不是4.5,从而也看下它的转换过程。 由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分的值分离出来。                   Address+0      Address+1                  Address+2             Address+3 格式         SEEEEEEE     EMMMMMMM       MMMMMMMM     MMMMMMMM 二进制     01000000         10010000               00000000                00000000 16进制     40                         90                            00                            00        可见:        S: 为0,是个正数。        E:为 10000001   转为10进制为129,129-127=2,即实际指数部分为2。        M:为 00100000000000000000000。 这里,在底数左边省略存储了一个1,使用 实际底数表示为 1.00100000000000000000000        到此,我们吧三个部分的值都拎出来了,现在,我们通过指数部分E的值来调整底数部分M的值。调整方法为:如果指数E为负数,底数的小数点向左移,如果指数E为正数,底数的小数点向右移。小数点移动的位数由指数E的绝对值决定。       这里,E为正2,使用向右移2为即得:       100.100000000000000000000 至次,这个结果就是4.5的二进制浮点数,将他换算成10进制数就看到4.5了,如何转换,看下面: 小数点左边的100 表示为 (1 × 22) + (0 × 21) + (0 × 20), 其结果为 4。 小数点右边的 .100… 表示为 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其结果为.5 。 以上二值的和为4.5, 由于S 为0,使用为正数,即4.5 。 所以,16进制 0x40900000 是浮点数 4.5 。 上面是如何将计算机存储中的二进制数如何转换成实际浮点数,下面看下如何将一浮点数装换成计算机存储格式中的二进制数。 举例将17.625换算成 float型。 首先,将17.625换算成二进制位:10001.101   ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不会将小数部分转换成二进制,请参考其他书籍。) 再将 10001.101 向右移,直到小数点前只剩一位 成了 1.0001101 x 2的4次方(因为右移了4位)。此时 我们的底数M和指数E就出来了: 底数部分M,因为小数点前必为1,所以IEEE规定只记录小数点后的就好,所以此处底数为   0001101 。 指数部分E,实际为4,但须加上127,固为131,即二进制数 10000011  符号部分S,由于是正数,所以S为0. 综上所述,17.625的 float 存储格式就是: 0 10000011 00011010000000000000000 转换成16进制:0x41 8D 00 00

-----------------------------------------------------我是分割线-------------------------------------

int,long int,short int的宽度都可能随编译器而异。但有几条铁定的原则(ANSI/ISO制订的):

sizeof(short int)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有