c++基础(1)数据类型

c++基础(一)数据类型

#include<iostream> //包含头文件,iostream标准的输入输出流
using namespace std;  //使用命名空间,;分号作为语句的结束
int main()      
//c++程序中只有一个main函数,是程序的入口,main是函数名,int是返回值类型,()中可添加形参
{       
  cout<<"hello wrold"<<endl;
//cout输出设备,屏幕,endl换行
  return 0;
/*return将其后的表达式结果或数值,作为函数的返回值返回,return结束当前函数*/
}

关键字

asmdoifreturntypedef
autodoubleinlineshorttypeid
booldynamic_castintsignedtypename
breakelselongsizeofunion
caseenummutablestaticunsigned
catchexplicitnamespacestatic_castusing
charexportnewstructvirtual
classexternoperatorswitchvoid
constfalseprivatetemplatevolatile
const_castfloatprotectedthiswchar_t
continueforpublicthrowwhile
defaultfriendregistertrue
deletegotoreinterpret_casttry

整形常量

二进制:是以0b开头,如0b00001010
十进制: 以正常数字1-9开头,如457 789
八进制: 以数字0开头,如0123
十六进制:以0x开头,如0x1e
a=10,b=11,c=12, d=13,e=14,f=15

c++不直接支持二进制的输入输出,cout默认是将数据以十进制输出,如果需要将数据以八进制、十六进制输出需要加上oct、hex,十进制dec

#include<iostream>
#include<bitset> //必要的头文件
using namespace std;
int main()
{
  cout<<oct<<0123<<endl; //cout需要使用oct输出八进制,以数字0开头
  cout<<hex<<0x123ef<<endl;  //cout需要使用hex输出十六进制,以0x开头
  cout<<bitset<8>(0b01010101)<<endl;//bitset<位数>(数值),位数一般都是8、16、32
  return 0;
}

整形变量

变量名的命名规则:由字母、数值、下划线(_)组成,不能由数值开头,不可以是关键字,区分大小写。
C++ 对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。

整形变量的初始化

变量的初始化:在变量定义的时候,给变量赋值 叫初始化
全局变量如果不初始化内容为0
局部变量如果不初始化内容为不确定(随机)

整型变量的使用

读和写(取值和赋值)

int num = 0;  //变量定义的时候,系统会给变量开辟空间,空间的大小取决于变量的类型,int就是4个字节
num=100;//写操作  
int data = 0;
data = num;//num读 data写
cout<<data<<endl;//读操作

变量的声明:对变量名以及类型 提前说明,不会为该变量开辟空间。先使用变量 后定义变量 必须事先对该变量进行声明.

#include <iostream>
using namespace std;
extern int num;     //先声明
int main(int agrc, char *argv[])
{
    cout<<"num="<<num<<endl;//再使用
    return 0;
}
int num=10;//最后定义,先定义后使用就不需要声明了

变量的定义:创建变量名 系统会为变量开辟空间
变量的声明:对变量的类型和名称 事先说明,不会为变量创建空间
变量的使用:对已经存在的变量的读写操作

字符常量

用单引号括起来,如:‘a’、‘b’、’0’等。注意单引号只能作用于一个字符(转义字符除外)

cout<<'a'<<endl;//输出的是字符
cout<<(int)'a'<<endl;//输出的是字符的ASCII值

字符变量

用char定义,每个字符变量被分配一个字节的内存空间字符值以ASCII码的形式存放在变量的内存单元
中。

char ch;
ch= 'x';//ch变量中存放的是字符'x'的ASCII :120,相当于ch=120
char ch='\0';//字符变量的初始化
'\0'和‘0’、数值0的区别
‘\0’字符常量(char) ASCII为0
数值0 是整型常量(int) 内存的存储值0
'0'字符常量(char)ASCII 为48

字符常量和字符串常量的区别

每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',
‘a’为字符常量,”a”为字符串常量
“a”包含两个字符‘a’和’\0’

实型(浮点数

单精度浮点数(float 4字节) 是双精度浮点数(double 8字节)

不以f结尾的实型常量为double类型 如:3.14
以f结尾的实型常量为float类型 如:3.14f
指数形式: 123e3 代表 123*10 的三次方 ,123e-3表示123 乘10的负三次方

实型变量初始化

float f=0.0f;//单精度实型变量:float f; 占4字节 以f结尾的实型常量初始化
double d=0.0;//双精度实型变量:double d;占8字节 不以f结尾的实型常量初始化

有符号数和无符号数

有符号数

数据二进制的最高位为符号位 其他位为数据位。
最高位为1 表示负数
最高位为0 表示正数

无符号数:没有符号位 所有二进制位都是数据位

int num;//默认num为有符号数
signed int num;//signed定义有符号数
unsigned int num;//unsigned定义无符号数

原码,反码,补码

负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储

关于补码

1、统一了0的编码
2、将减法运算变加法运算

存储方式

负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储
八进制数 以原码存储
十六进制 以原码存储

取值方式

如果是对 无符号变量 进行取值,输出内存的原样数据。
如果是对 有符号变量 进行取值,系统会去看内存的最高位,如果最高位为0 表明正数, 内存原样 输
出。
系统会去看内存的最高位,如果最高位为1 表明负数, 将内存数据求补码(得到原码) 输出

#include <iostream>
#include <bitset>
using namespace std;
int main()
{
    //先将-10转成无符号数(-10的补码)
    unsigned short data = -10;//原码1000 0000 0000 1010 补码1111 1111 1111 0110
    short data2=-10;//补码1111 1111 1111 0110  负数在计算机以补码的方式存储
    cout<<bitset<16>(data)<<endl;//1111 1111 1111 0110
    cout<<bitset<16>(data2)<<endl;//1111 1111 1111 0110
    cout<<"data="<<data<<endl;//65526==1111 1111 1111 0110  输出内存的原样数据,全部是数据位
    cout<<"data2="<<data2<<endl;//-10==1111 1111 1111 0110  根据最高位,原码输出
    return 0;
}

const修饰普通变量

如果以常量初始化 const修饰的只读变量 那么 只读变量的值 事先存放在“符号常量表中” 不会立即给data
开辟空间

#include <iostream>
#include <bitset>
using namespace std;
int main()
{   const int data=10;//以常量初始化 const修饰的只读变量 ,事先存放在“符号常量表中” 
    int*p=(int*)&data;//取地址开辟空间
    *p=100;  //在空间中赋值100
    cout<<data<<endl;//10,data从符号常量表中取值
    cout<<*p<<endl;//100,从为data开辟的空间中取值
    int a=10;
    const int data2=a;//以变量a初始化data2,会立即开辟空间
    int* q=(int*)&data2;
    *q=100;
    cout<<data2<<endl;//100,从为data开辟的空间中取值
    cout<<*q<<endl;//100,从为data开辟的空间中取值
    return 0;
}

当对data取地址时 系统才会为data开辟空间

如果以变量初始化 const修饰的只读只读变量 那么只读变量会立即开辟空间(没有符号常量表)
const修饰自定义类型变量 立即开辟空间 (没有符号常量表)

register修饰寄存器变量

如果变量 别高频繁使用 会自动将变量存储在寄存器中 目的:提高访问效率
如果用户想将变量 直接放入寄存器中 可以加register修饰

register int data=0;//data将放入寄存器中
//尽量不要对寄存器变量取地址
&data;
//register修饰的变量 只是尽量放入寄存器中,不一定放成功

volatile 关键字

强制访问内存

防止编译器优化

volatile int data=0;//对data的访问 必须从内存访问取值,

sizeof测量类型的大小

cout<<sizeof('a')<<endl;//1B
cout<<sizeof(10)<<endl;//4B
cout<<sizeof(short)<<endl;//2B
cout<<sizeof(long)<<endl;//32位平台 4B
cout<<sizeof(float)<<endl;//4B
cout<<sizeof(double)<<endl;//8B

typedef给已有的类型重新取个别名

typedef作用的步骤:
1、先用 已有的类型 定义一个普通的变量 int a;
2、用别名 替换 变量名 int INI32;
3、在整个表达式最前方 加typedef type int INI32;

//INT32就是int类型的别名
typedef int INT32;
INT32 data;
int num;//已有的类型任然有效

\和某些字符 结合 产生新的字符 就叫转义字符

'\0' == ASCII 为0
'\n' == 换行符
'\t' == tab缩进符
'\r' ==回到行首符号
'\a' ==发出警报

八进制转义

'\ddd' 每个d的范围必须是0~7 3个d表示最多识别3位八进制数据

十六进制转义

'\xhh' 每个h的范围0~9 a~f 2个h表示最多识别2位十六进制

类型转换

不同类型数据之间进行混合运算时必然涉及到类型的转换问题。

自动转换:
遵循一定的规则,由编译系统自动完成.
强制类型转换:
把表达式的运算结果强制转换成所需的数据类型

自动类型转换原则

占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。

无符号和有符号 参加运算 需要将有符号 转换成无符号

int和double参加运算 会将int转成从double类型

char和short类型 只要参加运算 都会将自己转换成int类型

强制类型转换

(类型说明符) (表达式)
功能:
把表达式的运算结果强制转换成类型说明符所表示的类型

(int)p+1 对p强转成int类型 然后再+1
(int)(p+1)对p+1强转成int类型
float f=3.14f;//不管是自动类型转换 还是强制类型转换 都是临时。
int x = 0;
x = (int)f;
cout<<"x ="<<x<<", f="<<f<<endl;//x =3, f=3.14
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值