C++基本内置类型
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++基本内置类型的更多相关文章
- golang的内置类型map的一些事
golang的map类型是一个比较特殊的类型,不同于int, string, byte这样的基本类型,在经过一番探究之后得出了一些结论: 1.golang的map类型虽然是内置类型,但和基本类型有很大 ...
- JavaScript备忘录(1)——内置类型
JavaScript有一些内置类型,还有很多常用的内置的方法,本文稍作总结,以备查阅. 值类型 我的理解,值类型是分配在栈上的,而引用类型(当然也包括引用类型内部的值类型)是分配在堆上的.值类型是不可 ...
- Python——内置类型
Python定义了丰富的数据类型,包括: 数值型:int, float, complex 序列:(iterable) str, unicode, tuple, list, bytearray, buf ...
- C++内置类型对象之间的转换
C++定义了一组内置类型对象之间的标准转换,在必要时它们被编译器隐式地应用到对象上. 隐式类型转换发生在下列这些典型情况下. 1. 在混合类型的算数表达式中 规则:在这种情况下最宽的数据类型成为目标转 ...
- C++ - 内置类型的最大值宏定义
内置类型的最大值宏定义 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24311895 C++中, 常常会使用, 某些类型的最大值 ...
- C++ 传参时传内置类型时用传值(pass by value)方式效率较高
来源:唐磊的个人博客<C++ 传参时传内置类型时用传值(pass by value)方式效率较高> 在<Effective C++>里提到对内置(C-like)类型在函数传参时 ...
- 易被忽略的Python内置类型
Python中的内置类型是我们开发中最常见的,很多人都能熟练的使用它们. 然而有一些内置类型确实不那么常见的,或者说往往会被我们忽略,所以这次的主题就是带领大家重新认识这些"不同寻常&quo ...
- Python isinstance 方法 判断 built-in types(内置类型)技巧
Python isinstance 方法 判断 built-in types(内置类型)技巧 d = {} isinstance(d, type({})) isinstance(d, dict) l ...
- Python内置类型——set
Python中,内置类型set和frozenset用来表示集合,我们首先查看这两个类型支持的特殊对象,从而可以理解他们的特性. >>> dir(set) ['__and__', '_ ...
随机推荐
- Easyui设置动态表格,动态导出数据实例,附Dome
最近碰到一个需求,需要提供一个弹出页面选择列表页面需要显示的列,页面确认之后需要修改列表页面显示的表格,导出的数据也需要同步变化. 下面直接上代码 1.设置需要显示的列columus为全局对象,用于子 ...
- CentOS yum 安装 PHP 5.6.24
配置yum源 追加CentOS 6.5的epel及remi源. # rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel- ...
- win7系统中使用DOS命令是出现乱码的解决方法
方法一:设置cmd显示字体1.win+R打开运行窗口->输入cmd->回车,打开命令行提示符窗口 win7系统运行窗口win7系统DOS命令行提示窗口 2.在命令行标题栏上点击右键,选择” ...
- Spring Web 配置文件加载路径问题
Spring: 定位 载入 注册 我们常用的加载context文件的方法有如下三个: 1.FileSystemXmlApplicationContext 这个方法是从文件绝对路径加载配置文 ...
- 开源搜索引擎abelkhan
发起一个开源项目http://www.abelkhan.com/ 目前而言,已经用python编写了一个网络爬虫抓取页面,和一个简单的前端 网络爬虫,已经有很多高手写过,我基本上奉行了拿来主义, 得益 ...
- 错误代码是1130,ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server 是无法给远程连接的用户权限问题
错误代码是1130,ERROR 1130: Host xxx.xxx.xxx.xxx is not allowed to connect to this MySQL server 是无法给远程连接的用 ...
- centos 7 yum方式安装MySQL 5.6
本文根据mysql的官方文档操作:https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 由于Centos7 默认数据库是mariabd(网上 ...
- c++数组易错点总结
c++数组 1.只有在定义数组是才能使用初始化,此后就不能使用了,也不能将一个数组赋给另一个数组 int cards[4] = { 3 , 6 , 8 , 10}; //ok int hands[4] ...
- 初步研究一下sourceTree
今天研究sourceTree,在此小结一下 1.下载链接:https://www.atlassian.com/software/sourcetree 2.安装,注册账户登录,连接到GitHub账号上, ...
- 由max_allowed_packet引发的mysql攻防大战
1.原因 程序的sql语句比较长.max_allowed_packet默认是1024.于是就报错了.一开始手动改 global max_allowed_packet ,改完后.莫名奇妙被还原.后来改配 ...