总结 C++中 基本内置类型 数据所占大小 和数据类型

来源:互联网 发布:linux运维面试会问什么 编辑:程序博客网 时间:2024/06/05 08:41

    以前看C++ primer ,基本内置类型的时候,大概只知道int型 表示整数,float 和double 型 表示浮点数, double型精度很高,决定自己用int 或者 double 的就是 我是小数还是 整数,便没有载关注细节。 直到现在做图像处理,因为图片较多,又限制32位4g内存, 所以对内存的把握就特别重要,重新去看数据类型大小和范围

   内置算术类型   :
   主要算术类型,见下面表格:

类型含义最小尺寸bool布尔类型未知char字符8位wchar_t宽字符16位char16_tUnicode16位char32_tUnicode32位short短整型 16位int整型32位long 长整型32位long long长整型64位float单精度浮点数6位有效数字,32位double 双精度浮点数10位有效数字,64位long double扩展精度浮点数10位有效数字
  内置类型的机器实现:
   比特 b:计算机以 比特序列存储数据,也就是通常说的“位”,也就是单个的“1” 或者 "0" ;    单位是b ;
   字节B: 不过大部分的时候,计算机用2的整数次幂为块处理内存,可寻址的最小内存块称为“字节(byte)” ,一般一个字节 有8 位  ,单位是B ;
   字 : 存储的基本单元称为“字(word)” , 不过这个概念不常用;
   K : 1K = 1024 B ;    1M=1024K  ;   1G=1024M   ;   1T=1024G   ;
  比如我们说一副1920*1080的图,假设用float 表示灰度值,因为float 大小是4个字节,所以大小应该为  1920*1080*4*3B = 1920*1080*4 *3 /1024/1024 = 23.7M  。 注意到图像灰度值都在0-255之间,也就是2的8次方(1个字节)足够表示,所以我们也可以用char型表示灰度值,这个时候一幅图的大小就是 23.7/4 M。 注意这个大小说的是,占用内存的大小,而不是存储到硬盘上的大小。

带符号类型和无符号类型
   除了布尔型和扩展的字符型之外,其他整型都可以划分为有符号型(signed)和无符号型(unsigned),有符号型可以表示负数,0,正数,无符号型只能表示0和正数。 
    对于非字符型char之外,int,float,double等均表示有符号型,比如int,表示的数字范围是 [-2^31 , 2^31 -1] 即 [-2147483648,2147483647] , 但是无符号int 则可以表示[0,4294967294] 范围,超出表示范围,结果则是根据编译器表示原理,得到一个其他的数,如果参与运算的话,结果则不在控制之内。其他同理。 值得一提的是,char型,如果不用signed 或者 unsigned 则每个机器上的表示是不一样的,就是说单纯一个char 型,有的可以表示负数,有的则不可以,如果用无符号说表示 负数,结果不受控制。  unsigned  char 表示 [0,255] , signed char [-127,127] 。

 数据类型的选择
    作为一个程序员,在定义一个变量的时候,心里要清楚要怎么应用这个数字,以及这个数字的大致范围。   
  1.   在明确知道数值不可能为负的时候,选用无符号整型,比如图像灰度值。
  2.   在执行整数运算的时候,如果不是对内存要求严格,选择int 型,因为short型表示范围为[-32767,32767], 是个 万  数量级的数字,实际应用中很可能超过范围。
  3.  因为char型 在有些机器上是有符号的 ,有些机器上是无符号的,所以如果需要使用一个不大的整数,使用时明确指定signed 或是 unsigned, 比如图像灰度值完全可以用signed char型表示,事实上 opencv 中就是用char表示的灰度值。



  
    

  

    

0 0
原创粉丝点击