C++基本内置类型

基本内置类型包括算术类型空类型

算术类型

算术类型包括整型浮点型

类型 含义 最小尺寸
bool 布尔型 -
char 字符型 8 bit
wchar_t 宽字符型 16 bit
short 短整型 16 bit
int 整形 16 bit
long 长整型 32 bit
long long 长整型 64 bit
float 单精度浮点型 6位有效数字
double 双精度浮点型 10位有效数字
long double 扩展精度浮点型 10位有效数字

C++中规定,一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long则至少和一个long一样大,其中,数据类型long long是在C++11中新定义的。

通过代码查看当前编译器各种类型所占尺寸。

#include<iostream>
using namespace std; int main()
{
cout << "bool\t" << sizeof(bool) << endl;
cout << "char\t" << sizeof(char) << endl;
cout << "wchar_t\t" << sizeof(wchar_t) << endl;
cout << "short\t" << sizeof(short) << endl;
cout << "int\t" << sizeof(int) << endl;
cout << "long\t" << sizeof(long) << endl;
cout << "long long\t" << sizeof(long long) << endl;
cout << "float\t" << sizeof(float) << endl;
cout << "double\t" << sizeof(double) << endl;
cout << "long double\t" << sizeof(long double) << endl;
system("pause");
return 0;
}

运行结果

bool    1
char 1
wchar_t 2
short 2
int 4
long 4
long long 8
float 4
double 8
long double 8
请按任意键继续. . .
  • 如何选取算术类型?

和C语言一样,C++的设计准则之一也是尽可能的接近硬件。C++的算术类型必须满足各种硬件特质,所以他们常常显得复杂而令人不知所措。事实上,大多数程序员能够(也应该)对数据类型的使用做出限定从而简化选择过程。以下是选择类型的一些经验准则:

1:当明确知晓数值不可能为负时,选用无符号类型

2:使用int 执行整数运算。在实际应用中,short 常常显得太小而long 一般和 int 有一样的尺寸。如果你的数值超过了int 的表示范围,选用long long

3:在算术表达式中不要使用char 或 bool,只用在存放字符或布尔值时才使用它们。因为类型char在一些机器上是有符号的,而另一些机器上又是无符号的,所以,如果使用char进行运算特别容易出问题。如果你需要使用一个不大的整数,那么明确指定的类型是 signed char 或者unsigned char;

4:执行浮点数运算选用double,这是因为float通常精度不够而且double和float的计算相差无几。事实上,对于某些机器来说,双精度运算甚至比单精度还快,long double提供的精度一般情况下是没有必要的,况且他带来的运行时消耗也不容忽视。

带符号和无符号类型

除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的和无符号的两种。带符号类型可以表示正数、负数和0,无符号类型则仅能表示大于等于0的值。

类型int、short、long和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。类型unsigned int可以编写为unsigned。

与其他整型不同,字符型被分为了三种:char、signed char和unsigned char。特别需要注意的是:类型char和类型signed char并不一样。尽管字符型有三种,但是字符的表现形式却只有两种:带符号的和无符号的。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器来决定。

类型的转换

类型所能表示的值的范围决定了转换的过程:

  • 当我们把一个非布尔型的算术值赋给布尔类型时,初始值0则结果是false,否则结果为true。例如:bool b=42;
  • 当我们把一个布尔型值赋给一个非布尔型时,初始值为false则结果是0,初始值为true则结果为1.
  • 当我们把一个浮点数赋给整型类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。
  • 当我们把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
  • 当我们赋给无符号类型一个超过它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,将-1赋给8比特的unsigned char 所得的结果是255.
  • 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。

含有无符号类型的表达式

尽管我们不会故意给无符号对象赋一个负值,却可能写出这么做的代码。例如,当一个算术表达式中既有无符号数又有int值时,那个int值就会转换为无符号数。把int转换为无符号数的过程和把int直接覆给无符号变量一样:

unsigned u=10;
int i=-42;
cout<<i+i<<endl; //输出-84
cout<<u+i<<endl; //如果int占32位,输出4294967264

在第一个输出表达式里,两个(负)整数相加并得到了期望的结果。在第二个输出表达式里,相加前首先把整数-42转换为无符号数。把负数转换为无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。

当从无符号数中减去一个值时,不过这个值是不是无符号的数,我们都必须确保结果不能是一个负值。

如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数会自动转换为无符号数。例如,在一个形如”a*b"的式子中,如果a=-1,b=1,而且a是int,b是unsigned,则结果须视在当前机器上int所占位数而定。

参考

http://blog.csdn.net/lingtianyulong/article/details/24390541

《C++ Primer》(第5版)

C++基本内置类型的更多相关文章

  1. golang的内置类型map的一些事

    golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论: 1.golang的map类型虽然是内置类型,但和基本类型有很大 ...

  2. JavaScript备忘录(1)——内置类型

    JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅. 值类型 我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的.值类型是不可 ...

  3. Python——内置类型

    Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...

  4. C++内置类型对象之间的转换

    C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上. 隐式类型转换发生在下列这些典型情况下. 1. 在混合类型的算数表达式中 规则:在这种情况下最宽的数据类型成为目标转 ...

  5. C++ - 内置类型的最大值宏定义

    内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...

  6. C++ 传参时传内置类型时用传值(pass by value)方式效率较高

    来源:唐磊的个人博客<C++ 传参时传内置类型时用传值(pass by value)方式效率较高> 在<Effective C++>里提到对内置(C-like)类型在函数传参时 ...

  7. 易被忽略的Python内置类型

    Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...

  8. Python isinstance 方法 判断 built-in types(内置类型)技巧

    Python isinstance 方法 判断 built-in types(内置类型)技巧 d = {} isinstance(d, type({})) isinstance(d, dict) l ...

  9. Python内置类型——set

    Python中,内置类型set和frozenset用来表示集合,我们首先查看这两个类型支持的特殊对象,从而可以理解他们的特性. >>> dir(set) ['__and__', '_ ...

随机推荐

  1. jQuery时间日期插件laydate,兼容bootstrap

    解压后,将laydate整个文件放至您项目的任意目录,不要移动其文件结构,它们具有完整的依赖体系. 使用只需在页面引入laydate.js即可. 如果您的网站的js采用合并或模块加载,您需要打开lay ...

  2. python 解析nginx 日志 url

    >>> import os>>> os.chdir('e:/')>>> log=open('access.log')//这两行是获取日志流> ...

  3. 怎么用jq封装插件

    怎么用jq封装插件 以隔行变色为例 实现原理:1.找到表格的奇偶行,然后添加不同的class,激活行高亮显示也很简单,只要判断mouseover事件,然后添加一个class,mouseout的时候,再 ...

  4. 限制input[type=number]的输入位数策略整理

    当我们使用类型number的input输入框的时候,我们可能需要限制输入的位数,这个时候通常会想到maxlength,但是maxlength是在number类型的时候是不支持的,下面是一些解决这种问题 ...

  5. 遍历Map和List的几种方法和性能比较

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  6. 预编译语句(Prepared Statements)介绍,以MySQL为例

    背景 本文重点讲述MySQL中的预编译语句并从MySQL的Connector/J源码出发讲述其在Java语言中相关使用. 注意:文中的描述与结论基于MySQL 5.7.16以及Connect/J 5. ...

  7. Java IO学习笔记(三)转换流、数据流、字节数组流

    转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...

  8. (转载)CloseableHttpClient设置Timeout

    参考文档: http://blog.csdn.net/zheng0518/article/details/46469051 https://segmentfault.com/a/11900000005 ...

  9. Linux安装SVN服务器

    “svn都快淘汰了” #安装subversion yum -y install subversion #创建svn仓库基础路径 mkdir /home/svn #创建svn仓库 svnadmin cr ...

  10. 2238"回文字串"报告

    题目描述: 回文串,就是从前往后和从后往前看都是一样的字符串.那么现在给你一个字符串,请你找出该字符串中,长度最大的一个回文子串. 输入描述: 有且仅有一个仅包含小写字母的字符串,保证其长度不超过50 ...