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__', '_ ...
随机推荐
- jQuery时间日期插件laydate,兼容bootstrap
解压后,将laydate整个文件放至您项目的任意目录,不要移动其文件结构,它们具有完整的依赖体系. 使用只需在页面引入laydate.js即可. 如果您的网站的js采用合并或模块加载,您需要打开lay ...
- python 解析nginx 日志 url
>>> import os>>> os.chdir('e:/')>>> log=open('access.log')//这两行是获取日志流> ...
- 怎么用jq封装插件
怎么用jq封装插件 以隔行变色为例 实现原理:1.找到表格的奇偶行,然后添加不同的class,激活行高亮显示也很简单,只要判断mouseover事件,然后添加一个class,mouseout的时候,再 ...
- 限制input[type=number]的输入位数策略整理
当我们使用类型number的input输入框的时候,我们可能需要限制输入的位数,这个时候通常会想到maxlength,但是maxlength是在number类型的时候是不支持的,下面是一些解决这种问题 ...
- 遍历Map和List的几种方法和性能比较
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...
- 预编译语句(Prepared Statements)介绍,以MySQL为例
背景 本文重点讲述MySQL中的预编译语句并从MySQL的Connector/J源码出发讲述其在Java语言中相关使用. 注意:文中的描述与结论基于MySQL 5.7.16以及Connect/J 5. ...
- Java IO学习笔记(三)转换流、数据流、字节数组流
转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...
- (转载)CloseableHttpClient设置Timeout
参考文档: http://blog.csdn.net/zheng0518/article/details/46469051 https://segmentfault.com/a/11900000005 ...
- Linux安装SVN服务器
“svn都快淘汰了” #安装subversion yum -y install subversion #创建svn仓库基础路径 mkdir /home/svn #创建svn仓库 svnadmin cr ...
- 2238"回文字串"报告
题目描述: 回文串,就是从前往后和从后往前看都是一样的字符串.那么现在给你一个字符串,请你找出该字符串中,长度最大的一个回文子串. 输入描述: 有且仅有一个仅包含小写字母的字符串,保证其长度不超过50 ...