文档章节

【C++注意事项】1 数据类型及类型转换

NoMasp
 NoMasp
发布于 2015/09/08 21:47
字数 1174
阅读 9
收藏 0

如何选择类型

1)当数值不可能为负时,选择无符号类型。

2)当数值超过了int的表示范围时,选用long long。

3)在算术表达式中不要使用char或bool,只有在存放字符串或布尔值时才使用它们。因为类型char在一些机器中是有符号的,而在另一些机器中又是无符号的。如果你需要使用一个不大的整数,那么明确指定它的类型是signed char或者unsigned char。

4)执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器而言,双精度运算甚至比单精度还快。long double提供的精度在一般情况下是没有必要的,况且它带来的运算时间消耗也是不容小觑的。

类型转换

1)当我们把一个非布尔类型的算术值赋给布尔类型时,初始值为0则结果为false,否则结果为true。

2)当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1.

3)当我们把一个浮点数赋给整数类型时,进行了近视处理。结果值将保留浮点数中小数点之前的部分。

4)当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char可以表示0至255区间的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char所得的结果是255。

5)当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。

无符号数的转换

下面再来展示一个有意思的代码片。

unsigned u = 10;
int i = -42;
cout<<i + i<<endl;  // 输出:-84
cout<<u + i<<endl;  // 输出:4294967264

第一个输出应该就不用说了,对于第二个,首先将-42转换成无符号数,把负数转换成无符号数类似于直接给无符号数赋一个负值,结果就等于这个负数加上无符号数的摸。是不是有些拗口呢?看看下面的代码呢?

int i = -42;
unsigned w=i;
cout<<w<<endl;  // 输出为:4294967254

在来看看下面这段代码:

unsigned u1=42,u2=10;
cout<<u2-u1<<endl;  // 输出:4294967264
unsigned u=-32;
cout<<u<<endl;  // 输出:4294967264 和上面的两段代码一样,都是将-32转换为无符号数

还有一点需要注意的。比如在写一个将数字从10到0的降序输出时,考虑到无符号数不会小于0这一铁律,你是否会这样写呢?

for(unsigned i =10; i>=0; --i)
    cout<<i<<endl;

这是一个陷阱…… 因为当i等于0的时候,输出0是显然的,然而在继续执行for循环中的自减操作后得到了-1,-1并不满足无符号数的要求,因此就像前面的例子那样就被转换成了一个合法的无符号数(4294967295)。

解决这个问题的关键在于要在输出变量之前先减去1。这样的话,如果循环从10开始,减去1后输出结果就成了9到0了,因此初始化时要设置为11。

而且最终截断点不应该是i==0,而应该是i>0,所以应该这样改:

for(unsigned i =11; i>0;)
{ --i; cout<<i<<endl; }

当然了,既然截断点是大于0,这正好可以用上while循环了。

unsigned i =11;
while(i>0)  // 此处写成 while(i) 也是可以的
{
    --i;
    cout<<i<<endl;
}

备注:该【C++注意事项】系列参考了《C++ Prime 》一书和网络资源,主要用于给自己复习、总结,也希望对广大读者有帮助。



感谢您的访问,希望对您有所帮助。 欢迎大家关注、收藏以及评论。

我的更多博客文章:NoMasp博客导读


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/45874233

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

C++强制类型转换:staticcast、dynamiccast、constcast、reinterpretcast 1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换...

shzwork
03/12
3
0
C/C++ 之 C++强制类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)

文章转载自:https://www.cnblogs.com/chenyangchun/p/6795923.html 。在了解这块时,发现了这篇文档,感觉写的很不错! c强制转换与c++强制转换 c 语言强制类型转换主要用于基础的数据类型间...

ZCShouCSDN
2018/12/19
0
0
FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一。Lua的轻量、小巧、概念之简单,都使他变得越来越受欢迎。本人也使用过python做嵌入式脚本,二者各有特...

知然
2013/01/27
0
0
C++笔记(一)20110223

近日,公司准备用C++来做个类似openmeetings的软件。C++只是在学校时学习了,当当购了三本《Visal C++ 入门经典(第五版)》、《深入浅出MFC》、《Visaual C++ 音频你/视频处理技术及工程实践...

钟小华
2011/02/23
342
0
iOS7中Objective-C和Foundation的新特性(What’s New in Obj

说明 注意事项(Ray):文章来自iOS 7 by Tutorials iOS 7Feast的一部分(略) Objective-C 是最重要的iOS和OSX apps的开发工具。你可以使用其他语言的第三方框架开发apps,例如HTML&Javasc...

我心java
2014/04/20
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
31分钟前
27
0
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
9
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部