一点一滴《C++处理数据》
1:(整数)short,int,long类型
short:至少16位
Int:至少与short一样长
long:至少32位,且至少与int一样长
下来看下程序输出的结果:
#include <iostream>
#include <math.h>
#include <limits>
using namespace std;
int main()
{
int a=INT_MAX;
short b=SHRT_MAX;
long c=LONG_MAX;
cout<<"int is"<<sizeof(a)<<"bytes"<<endl;
cout<<"short is"<<sizeof(b)<<"bytes"<<endl;
cout<<"long is"<<sizeof(c)<<"bytes"<<endl;
cout<<"最大值"<<endl;
cout<<"int"<<a<<endl;
cout<<"short"<<b<<endl;
cout<<"long"<<c<<endl;
cout<<"最小值"<<INT_MIN<<"----"<<CHAR_BIT<<endl;
return 0;
}
输出为:
int is 4 bytes
short is 2 bytes
long is 4 bytes
int 的最大值:2147483647
short的最大值:32767
long的最大值:2147483647
int的最小值:-2147483648
一个byte是8个bit
这些我都是在 Windows 7 x64 旗舰版上测试的,其它的系统就没测试了,估计也有一样和不一样的。
2:操作符 sizeof和头文件limits
sizeof操作符指出,在使用8位字节的系统中,int的长度为4个字节。可以对类型名和变量名使用sizeof操作符。
如:cout<<"int is"<<sizeof(int)<<"bytes"<endl;
climits的符号常量
符号常量 |
表示 |
CHAR_BIT |
char的位数 |
CHAR_MAX |
char的最大值 |
CHAR_MIN |
char的最小值 |
SCHAR_MAX |
signed char的最大值 |
SCHAR_MIN |
signed char的最小值 |
UCHAR_MAX |
unsigned char的最大值 |
SHRT_MIN |
short的最小值 |
SHRT_MAX |
short的最大值 |
USHRT_MAX |
unsigned short的最大值 |
INT_MAX |
int的最大值 |
INT_MIN |
int的最小值 |
UINT_MAX |
unsigned int的最大值 |
LONG_MAX |
long的最大值 |
LONG_MIN |
long的最小值 |
ULONG_MAX |
unsigned long的最大值 |
3:初始化
将声明和赋值合并在一起:如
int a=INT_MAX;
注:不对函数内部定义的变量初始化,该变量的值将是不确定的。这意味该变量的值将是它被创建之前,该内存单元保存的值
4:无符号类型
unsigned short a;
unsigned int b;
unsigned c;
a,b,c都是int类型
看段程序:
#include <iostream>
#include <limits>
using namespace std;
#define ZERO 0
int main()
{
short a=SHRT_MAX;
unsigned short b=a;
cout<<"a has $"<<a<<"and b add $1 to each account"<<endl<<"NOW";
a=a+1;
b=b+1;
cout<<"a has $"<<a<<"and b has $"<<b<<endl;
a=ZERO;
b=ZERO;
cout<<"a has $"<<a<<"and b has $"<<b<<endl;
cout<<"take $1 to each account"<<endl;
a=a-1;
b=b-1;
cout<<"a has $"<<a<<"and b has $"<<b<<endl;
cin>>a;
return 0;
}
解释下这段程序:
short类型的a和unsigned short类型的b都取最大值,在这里最大值是:32767。
从而都加上1,从这开始这两个的值都变了,short类型的最大值还要再加上1,可以见得,a的值变成:-32768
unsigned short类型的b值变成:32768
下来同时设置a和b的值为:0,再减去1,从而得出的结果为
short类型的a最后值为:-1
unsigned short类型的b最后值为:65535
可以看出,整形变量的行为就是里程表。如果超出了限制,其值为另一端的值。
如下图:典型的整形溢出行为
5:选择整形类型
什么情况是用什么类型,这可真是个麻烦啊。
一般基本都是int类型,而超出int类型范围的用long类型。
所以要看具体情况而定用什么类型,现在电脑基本都是X86或者X64 的电脑,不存在16位的电脑,所以随便用,但也要注意点用,越节约越好。
6:整形常量
如:
int a=42;
int b=0x42;
int c=042;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
1:第一位为1-9,则基数为10(10进制)
2:第一位为0,第二位为1-7,则基数为8(8进制)
3:前两位为0x,或者0X,则基数为16(16进制),对于16进制数:a-f,A-F表示了16进制位,对应与10-15.0xF为15,ox45为165(10个16加5个1)。
cout默认是以10进制显示的。
显示上面的列子为:
42
66
34
7:如何确定常量的类型
如把1900确定什么类型呢,答案马上揭晓。(如果使用了特殊的后缀表示特定的类型,或者值太大,不能存储为int类型。)否则都是i存储nt类型。
数字后面跟上字母,字母表示的是数字的类型。
整数后面跟的是l或者L表示该整数类型为:long,u或者U后缀表示unsigned int常量。ul(可以表示任何一种顺序,大小写都可以)表示unsigned long类型的常量(例如:22022LU或者22022UL都被存储为unsigned long类型)。
接下来考察的是数字的长度。
对与不带后缀的10进制的数字来说:2000表示int类型,40000表示long类型,3000000000表示unsigned long类型。
对于不带后缀的16进制的数字来说:0x9c40(40000)表示unsigned int类型。这表示的内存的地址
因此:unsigned int 比long更为合适的表示16位地址
8:char类型:字符和小数
char a;
cout<<"enter string"<<endl;
cin>>a;
cout<<a<<endl;
假如输入的是:M
输出的是M呢,还是77,显而易见的是M。而在内存中的值是:77
char a;
cout<<"enter string"<<endl;
cin>>a;
int b=a;
cout<<"The ASCII code for"<<a<<"is"<<b<<endl;
b=b+1;
cout<<"The ASCII code for"<<a<<"is"<<b<<endl;
cout<<"using cout.put()"<<endl;
cout.put(a);
输入:M
输出:77
78
M
所以就cout.put();就很关键了。
9:cout.put()函数
cout.put();可以代替<<操作符
它提供了一种显示字符的方法。不用在转换ASCII码了!
10:char常量
11:通用字符名
12:signed char和unsigned char
13:
14:const 限定符