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

c++基本数据类型

什么样的数据算是byte类型,int类型,float类型,double类型,long类型?

byte类型,就是字符类型.这类数据是字符组成的
FLOAT,为数字浮点型,其小数点后面能够跟N个数字
DOUBLE,为双精度数字类型,其小数点后仅仅能有两个数字

int类型

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGlwaXNvcnJ5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" width="584" height="284" />

上面提到了在32位机器和64机器中int类型都占用4个字节。

后来,查了The C Programming language这本书,里面有一句话是这种:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是编译器能够依据自身硬件来选择合适的大小,可是须要满足约束:short和int型至少为16位,long型至少为32位,而且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中通常是32位机器和64位机器中int型都是4个字节(比如。GCC)。

以下列举在GCC编译器下32位机器和64位机器各个类型变量所占字节数:

C类型

             32               64
    char             1                1
    short int             2                2
    int             4                4
    long int             4                8
    long long int             8                8
    char*             4                8
    float             4                4
    double             8                8

关于带符号与无符号类型:整型 int、stort  和  long 都默觉得带符号型。

要获得无符号型则必须制定该类型为unsigned,比方unsigned long。

unsigned int类型能够简写为unsigned。也就是说,unsigned后不加其它类型说明符就意味着是unsigned int。

Note:
c语言中int类型为4bytes(64位机上,32位机应该也是),也就是说总是4bytes而不会变,只是不同语言定义的范围不同,如python中是8bytes(64位机)实际对象占用28bytes。
#include <stdio.h>
#include <limits.h>
int main()
{
    printf("The value of INT_MAX is %i\n", INT_MAX);
    printf("The value of INT_MIN is %i\n", INT_MIN);
    printf("An int takes %ld bytes\n", sizeof(int));
    return 0;
}
The value of INT_MAX is 2147483647
The value of INT_MIN is -2147483648
An int takes 4 bytes

一字节表示八位,即:1byte = 8 bit;
int: 4byte =  32 bit 有符号signed范围:2^31-1 ~ -2^31即:2147483647 ~ -2147483648        无符号unsigned范围:2^32-1 ~ 0即:4294967295 ~ 0
long: 4 byte = 32 bit 同int型
double: 8 byte = 64 bit 范围:1.79769e+308 ~ 2.22507e-308
long double: 12 byte = 96 bit 范围: 1.18973e+4932 ~ 3.3621e-4932
float: 4 byte = 32 bit 范围: 3.40282e+038 ~ 1.17549e-038
int、unsigned、long、unsigned long 、double的数量级最大都仅仅能表示为10亿,即它们表示十进制的位数不超过10个,即能够保存全部9位整数。

而short仅仅是能表示5位。

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. void main(){
  6. int i = 65;
  7. cout<<char(i)<<endl;                    //输出‘A' <=>printf("%c\n", i);
  8. stringstream ss;
  9. ss<<i;
  10. string s;
  11. ss>>s;
  12. cout<<s<<endl;                      //输出”65“
  13. char *c = new char;
  14. itoa(65, c, 10);
  15. cout<<c<<endl;                      //输出”65“
  16. //cout<<strcmp(c, "65")<<endl;
  17. }

[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引用。

事实上这是非常easy理解的。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:

C++基本数据类型及类型转换的更多相关文章

  1. java与.net比较学习系列(3) 基本数据类型和类型转换

    在Java中,数据类型分为两类,一类是基本数据类型,另外一类是引用类型. 而在C#中,数据类型分为三类,分别是基元类型,值类型和引用类型.其中基元类型是.net framework框架中预定义的类型, ...

  2. 【转】java与.net比较学习系列(3) 基本数据类型和类型转换

    原文地址:https://www.cnblogs.com/mcgrady/p/3397874.html 阅读目录 一,整数类型 二,浮点数类型 三,字符类型 四,布尔类型 五,类型转换之自动转换 六, ...

  3. 大数据学习--day02(标识符、变量、数据类型、类型转换、进制转换、原码反码补码)

    标识符.变量.数据类型.类型转换.进制转换.原码反码补码 标识符: java50个关键字不能做标识符,以数字开头不能做标识符(这个老是忘记写一个类名的时候) 变量: 变量分为成员变量和局部变量,注意作 ...

  4. python入门4 python查看数据类型及类型转换

    查看数据类型:type() 类型转换:int(),float(),char(),ord(),str(),bool() #coding:utf-8 #/usr/bin/python "&quo ...

  5. 【Python系统学习02】数据类型与类型转换

    一.数据类型 字符串 整数 浮点数 [补充中...] 1.字符串 str 字符串:英文string,简写str. name = '小石头:' print(name,'2019', '12', '24' ...

  6. 2 JavaScript输出&字面量&变量&操作符&语句&标识符和关键字&字符集&语句&数据类型与类型转换

    JS输出: JavaScript没有任何打印或者输出的函数,但是可以用不同的方式输出数据 window.alert():弹出警告框 document.write():写入文档 innerHTML:写入 ...

  7. 02-JS中的数据类型及类型转换

    02-JS中的数据类型及类型转换 一.数据类型 JS中的值,无论是字面量还是变量,都有明确的类型. (一)概述 1.基本类型5种 number 数字类型 string 字符串类型 boolean 布尔 ...

  8. SSIS 数据类型和类型转换

    在进行ETL开发时,数据类型(Data Type)是最基础的,但也容易被忽略,楼主使用的SQL Server 版本是2012,用此博文记录,常用的SSIS数据类型和TSQL数据类型的映射.SSIS的数 ...

  9. 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别

    3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...

  10. .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等

    1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...

随机推荐

  1. 模仿世纪佳缘网站PC端的首页效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. vue.js源码学习分享(三)

    /** * Mix properties into target object.//把多个属性插入目标的对象 */ function extend (to, _from) { for (var key ...

  3. Scrapy学习-11-Selector对象使用

    Selector使用 使用背景 我需要使用类似spider项目中,response使用的xpath和css获取页面指定数据,但因为爬取页面较小我们不想创建一个spider项目时,就可以使用scrapy ...

  4. AC日记——太空飞行计划 洛谷 P2762

    题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的 ...

  5. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  6. HDU 1018.Big Number-Stirling(斯特林)公式 取N阶乘近似值

    最近一堆题目要补,一直咸鱼,补了一堆水题都没必要写题解.备忘一下这个公式. Stirling公式的意义在于:当n足够大时,n!计算起来十分困难,虽然有很多关于n!的等式,但并不能很好地对阶乘结果进行估 ...

  7. CCCC L2-023. 图着色问题【set去重判不同种类个数/简单图论/判断两相邻点是否存在同色以及颜色个数】

    L2-023. 图着色问题 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 图着色问题是一个著名的NP完全问题.给定无向图 G ...

  8. SSL/TLS协议

    今天闲着给自己的网站申请了一个免费证书,顺便复习下SSL/TLS协议    (https 就是在http+ssl协议) SSL介绍: 安全套接字(Secure Socket Layer,SSL)协议是 ...

  9. dtrace 语法

    Usage: dtrace [-aACeFHlqSvVwZ] [-arch i386|x86_64] [-b bufsz] [-c cmd] [-D name[=def]]      [-I path ...

  10. xcode创建一个工程的多个taget,便于测试和发布多个版本

    背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块 ...