C++基本数据类型及类型转换

来源:互联网 发布:华彬网络商学院 编辑:程序博客网 时间:2024/06/02 05:31

http://blog.csdn.net/pipisorry/article/details/25346379

c++基本数据类型

什么样的数据算是byte类型,int类型,float类型,double类型,long类型?
byte类型,就是字符类型.这类数据是字符组成的
INT 类型,为整型数字,不同语言定义的范围不同
FLOAT,为数字浮点型,其小数点后面可以跟N个数字
DOUBLE,为双精度数字类型,其小数点后只能有两个数字
LONG,为长整型其范围要比INT类型范围广
皮皮blog


c++类型转换

1. c++中string到int的转换

1) 在C标准库里面,使用atoi:

#include <cstdlib> 
#include <string>

std::string text = "152"; 
int number = std::atoi( text.c_str() ); 
if (errno == ERANGE) //可能是std::errno 

 //number可能由于过大或过小而不能完全存储 

else if (errno == ????) 
//可能是EINVAL 

 //不能转换成一个数字 
}

2) 在C++标准库里面,使用stringstream:(stringstream 可以用于各种数据类型之间的转换)

#include <sstream> 
#include <string>

std::string text = "152"; 
int number; 
std::stringstream ss;


ss << text;//可以是其他数据类型
ss >> number; //string -> int
if (! ss.good()) 

//错误发生 
}

ss << number;// int->string
string str = ss.str(); 
if (! ss.good()) 

 //错误发生 
}

3) 在Boost库里面,使用lexical_cast:

#include <boost/lexical_cast.hpp> 
#include <string>

try 

 std::string text = "152"; 
 int number = boost::lexical_cast< int >( text ); 

catch( const boost::bad_lexical_cast & ) 

 //转换失败 
}                      

[如何将字符串转换int64_t]

int转换成string

c++中将输入的数字以字符(串)形式输出

  1. #include <iostream>  
  2. #include <sstream>  
  3. #include <string>  
  4. using namespace std;  
  5.   
  6. void main(){  
  7.     int i = 65;   
  8.     cout<<char(i)<<endl;                    //输出‘A' <=>printf("%c\n", i);  
  9.   
  10.     stringstream ss;  
  11.     ss<<i;  
  12.     string s;  
  13.     ss>>s;  
  14.     cout<<s<<endl;                      //输出”65“  
  15.       
  16.     char *c = new char;  
  17.     itoa(65, c, 10);  
  18.     cout<<c<<endl;                      //输出”65“  
  19.     //cout<<strcmp(c, "65")<<endl;    
  20. }  
[http://bbs.csdn.net/topics/390401758?page=1#post-394058528]


2.string 转 CString

CString.format(”%s”, string.c_str());
用c_str()确实比data()要好;

3.char 转 CString

CString.format(”%s”, char*);

4.char 转 string

string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().

5.string 转 char *

char *p = string.c_str();

6.CString 转 string

string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

7.字符串的内容转换为字符数组和C—string

(1)  data(),返回没有”\0“的字符串数组
(2)  c_str(),返回有”\0“的字符串数组
(3)  copy()

8.CString与int、char*、char[100]之间的转换

(1) CString互转int

将字符转换为整数,可以使用atoi、_atoi64或atol。而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下。

void CStrDlg::OnButton1()
{
   CString
   ss=”1212.12″;
   int temp=atoi(ss);
   CString aa;
   aa.Format(”%d”,temp);
   AfxMessageBox(”var is ” + aa);
}

(2) CString互转char*

///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”; //?
strtest=charpoint;

///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());

(3) char *转成CString

标准C里没有string,char *==char []==string, 可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。
    要把CString转成char *,用操作符(LPCSTR)CString就可以了。
    CString转换 char[100]
   char a[100];
   CString str(”aaaaaa”);
   strncpy(a,(LPCTSTR)str,sizeof(a));


static_cast类型转换

static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。

注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。

C++primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释
1、C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为显式类型转换使用。比如:
1
2
3
inti;
floatf = 166.71;
i = static_cast<int>(f);
此时结果,i的值为166。
2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:
1
2
3
inti;
char*p = "This is an example.";
i = reinterpret_cast<int>(p);
此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,//i 也是指针,整型指针;一个明显的现象是在转换前后没有数位损失。

虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用。其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用;在方法中定义一个static变量,该变量在程序开始存在直到程序结束;类中定义一个static成员,该成员随类的第一个对象出现时出现,并且可以被该类的所有对象所使用。对static限定的改变必然会造成范围性的影响,而const限定的只是变量或对象自身。但无论是哪一个限定,它们都是在变量一出生(完成编译的时候)就决定了变量的特性,所以实际上都是不容许改变的。这点在const_cast那部分就已经有体现出来。

static_cast和reinterpret_cast一样,在面对const的时候都无能为力:两者都不能去除const限定。两者也存在的很多的不同,比如static_cast不仅可以用在指针和引用上,还可以用在基础数据和对象上;reinterpret_cast可以用在"没有关系"的类型之间,而用static_cast来处理的转换就需要两者具有"一定的关系"了。reinterpret_cast可以在任意指针之间进行互相转换,即使这些指针所指的内容是毫无关系的,也就是说一下语句,编译器是不会报错的,但是对于程序来说也是毫无意义可言的,只会造成程序崩溃

unsignedshort Hash( void *p ) {

unsignedlong val = reinterpret_cast<unsignedlong>( p );

return ( unsigned short )( val ^ (val >> 16));

}


int main() {

typedefunsignedshort (*FuncPointer)( void *) ;

FuncPointer fp = Hash; //right,this is what we want

int a[10];constint* ch = a; //right, array is just like pointer

char chArray[4] = {'a','b','c','d'};

fp = reinterpret_cast<FuncPointer> (ch); //no error, but does not make sense

ch = reinterpret_cast<int*> (chArray); //no error

cout <<hex<< *ch; //output: 64636261 //it really reinterpret the pointer

}

而以上转换,都是static_cast所不能完成的任务,也就是说把上边程序里所有的reinterpret_cast换成static_cast的话,就会立即得到编译错误,因为目标指针和原始指针之间不存在"关系"

从上边的程序,也就一下子看出来了reinterpret_cast和static_cast之间最本质的区别。

但是从基类到子类的转换,用static_cast并不是安全的,具体的问题会在dynamic_cast一篇阐述。

在指针和引用方便,似乎也只有继承关系是可以被static_cast接受的,其他情况的指针和引用转换都会被static_cast直接扔出编译错误,而这层关系上的转换又几乎都可以被dynamic_cast所代替。这样看起来static_cast运算符的作用就太小了。

实际上static_cast真正用处并不在指针和引用上,而在基础类型和对象的转换上 。 而基于基础类型和对象的转换都是其他三个转换运算符所办不到的

from: http://blog.csdn.net/pipisorry/article/details/25346379

ref: 

0 0
原创粉丝点击