基本数据类型
七种基本的 C++ 数据类型:
注:
其实 wchar_t 是这样来的:typedef short int wchar_t;所以 wchar_t 实际上的空间是和 short int 一样。
类型修饰符
signed
unsigned
short
long
一些基本类型可以使用一个或多个类型修饰符进行修饰。C++允许在Char int double 前放置类型修饰符。
修饰符 signed、unsigned、long 和 short 可应用于整型,signed 和 unsigned 可应用于字符型,long 可应用于双精度型。修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀。例如:unsigned long int。
省略int:C++ 允许使用速记符号来声明无符号短整数或无符号长整数。您可以不写 int,只写单词 unsigned、short 或 unsigned、long,int 是隐含的。例如,下面的两个语句都声明了无符号整型变量。
unsigned x;
unsigned int y;
char 1
int 4
float 4
double 8
有无signed不改变字节数,但是影响取值范围unsigned只能非负,signed可以负数。
short把4变成2
long把4变8
下面着重探讨一下类型修饰符的符号:
先说一下计算机存储数字的问题:(最主要的问题就是几种码对负数表示不同)
原码:正数不变,负数最高位变1(导致0具有二义性)
反码:正数反码和原码一样,负数反码符号位与原码一致,其余位取反。
补码(计算机以补码形式存储):正数原码反码补码一致,负数补码=反码最末位+1
为了理解 C++ 解释有符号整数和无符号整数修饰符之间的差别,我们来运行一下下面这个短程序:
#include <iostream>
using namespace std;
/*
* 这个程序演示了有符号整数和无符号整数之间的差别
*/
int main()
{
short int i; // 有符号短整数
short unsigned int j; // 无符号短整数
j = 50000;
i = j;
cout << i << " " << j;
return 0;
}
发现输出的有符号短整型i变成了-15536,这是怎么来的?
1)50000的二进制数为1100 0011 0101 0000,以补码形式存在(注意这里为什么要用短整型来验证而不是用整形,短整型刚刚号两个字节,50000的最高位刚好为1,最高位会变化,而整型4个字节就不会输出i为负数,可以自己试一下)
2)首先看j,j作为无符号数正数,所以补码转化成原码不变,数值还是50000
3)那i呢?对于一个有符号的数,其最高位(加粗位)为1表示负数,我们得按照
补码—》反码——》原码 的顺序反推。
所以负数补码1100 0011 0101 0000减去1为反码1100 0011 0100 1111
然后负数反码到原码最高位不变其他位取反,得到原码1011 1100 1011 0000 ,最高位代表负数。则此数为负的011 1100 1011 0000,即-15536.
typedef声明:
可以使用typedef给上述基本类型取一个