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__', '_ ...
随机推荐
- ionic结合HTML5实现打电话功能
HTML5中这样子可以实现打电话的功能,但是在ionic实际项目中,并不是直接就可以这样子用,需要配置一下config.xml文件就可以在手机上调用到自己的联系人打电话页面了, 因为项目是引用的Cor ...
- .net 4.0 中的特性总结(二):默认参数、命名参数
1.在方法定义的时候为参数指定一个默认值.调用方法的时候既可以像平时那样传入参数,也可以直接跳过不传入,这样的话,就使用默认值传到方法里.例如: 2.在之前版本的C#中,方法定义的参数顺序必须与方法调 ...
- twisted学习之reactor
reactor是twisted框架里面一个很重要的抽象,它为我们实现了循环,所以我们不用再去实现循环了. reactor有如下特点: 1.reactor循环会一致运行下去,可以使用Ctrl+C或者相关 ...
- webpack vue 配置
vue-loader 1.)首先创建项目目录 --vue-loader文件夹 |-index.html 入口文件 |-main.js 入口文件 |-App.vue Vue文件 |-package.js ...
- github用法小结
共享仓库 bare 裸仓库 生成裸仓库时必须以.git结尾. 仓库就相当于一个服务器 ### 创建远程仓库 1. 创建以.git结尾的目录mkdir repo.git 2 ...
- linux 系统中的 /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin 目录的区别
先来段英文的: /bin This directory contains executable programs which are needed in single user mode and to ...
- 13.什么是javabean,以及使用原则
javabean简介 javabeans就是符合某种特定的规范的java类,使用javabeans的好处是解决代码的重复编写,减少代码 冗余,功能区分明确,提高了代码的维护性. javabean的设计 ...
- 第二章(jQuery选择器)
2.1jQuery选择器是什么 1.CSS选择器 选择器 示例 选择器 示例 标签选择器 a{ } p{ } ul{ } ID选择器 #ID{ } 类选择器 .class{ } 群组选择器 td,p, ...
- accp8.0转换教材第9章JQuery相关知识理解与练习
自定义动画 一.单词部分: ①animate动画②remove移除③validity有效性 ④required匹配⑤pattern模式 二.预习部分 1.简述JavaScript事件和jquery事件 ...
- v2013调试无法访问此网站 localhost 拒绝了我们的连接请求
问题描述: 别人给的服务器代码,在本地部署以后调试的,localhost:8080 可以访问,localhost:2524访问不了需要改什么配置吗 解决思路: 这 ...