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

如何选择类型

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


Deepseek 10分钟化身理性荐股神器:触碰程序员不敢想的天花板 在这个消息疯狂、波动频繁的市场,“理性”两字显得弥足珍贵。通过Deepseek+AkShare+Aktools+Dify四位一体的方案,能帮我们降低信息搜集成本,并在短期投资领域搭建出一套“可解释、低门槛、易定制”的量化荐股流程。不要再盲目听小道消息或依赖情绪驱动,不妨给自己一个机会,让数据说话。而要注意的是,“理性荐股”并非万能,它只是工具,最终的收益还得依赖投资者自身对风险和机遇的权衡。祝大家都能在这股市里收获理性的底气,寻得更精准的入场时机。 阅读详情

相关推荐

unity中简单全景搭建

全景场景能够直观的展现一部分区域的全貌,在全景场景中我们能360°观看周围的景象,仿佛自身就在这个场景中,在场景的外部,我们能发现场景就是一个密封的球体,我们是处在球体的内部观察周围,在球内部观察四周看到的都是球的内表面,所以我们看到的全景其实就是贴在密封球体内的一张全景图片。接下来要介绍的就是如何在unity中用一个球体来搭建全景场景。

qq_31791999的博客 3621

C++类型转换注意事项

1、如果两个类型可以相互转换,就说他们是关联的。 2、隐式转换是指,由编译器自行转换,而不需要程序员介入的转换。 3、以下情况,编译器会发生隐式转换:   1)在大多数表达式中,比int类型小的整型值会被提升为较大的整型值。   2)在条件语句中,非布尔类型会被转换成布尔类型。   3)初始化过程中,初始值的类型转换成变量的类型时,赋值运算符的右侧运算对象的类型会被转换成左侧 ...

weixin_30823833的博客 236

Python爬虫实战:社交媒体热点事件追踪与情感分析可视化

本文探讨了如何利用Python爬虫技术从微博和Twitter等社交媒体平台抓取数据,进行热点事件追踪和情感分析,并通过可视化方式展示舆论情感变化。文章详细介绍了最新的爬虫技术、数据处理方法和可视化实现,提供了完整的代码示例,帮助读者构建自己的社交媒体分析系统。关键词:Python爬虫、社交媒体分析、情感分析、数据可视化、热点追踪爬虫框架:Requests-HTML、aiohttp、Twint(Twitter专用)数据处理文本处理:Jieba(中文分词)、NLTK(英文处理)情感分析。

2201_76125261的博客 1084

【c/c++类型转换:隐式类型转换、强制类型转换

类型转换是编程中一个常见的现象。在我们进行编码的时候不经意间就发生了,很可能就给我们带来不少bug。所以我们需要了解类型转换以及对应得出现场景。

m0_73726899的博客 2207

C++基础知识-------类型转换

前言 在C语言中,我们,就知道强制类型转换和隐式类型的转换,但是这种转换其实是不太安全的,既然我们学了C++,那么我们就应该尽量使用c++类型转换,为什么呢? 因为 c++类型转换的方式,他们都是通过类模板的方式实现,安全性得到保证,通过不同的用途使用不同的显示类型转换模板 C语言的强制类型转换 C风格的强制转换(Type Cast)容易理解,不管什么类型的转换都可以使用使用下面的方式. TypeName b = (TypeName)a; c++版本 四种强制转换类型函数 const_cast 主

weixin_43743711的博客 266

C++类型转换

C语言和C++都是强类型语言,如果赋值运算符左右两侧变量的类型不同,或形参与实参的类型不匹配,或返回值类型与接收返回值的变量类型不一致,那么就需要进行类型转换。C语言中有两种形式的类型转换,分别是隐式类型转换和显式类型转换:隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转换:需要用户自己处理,以`(指定类型)变量`的方式进行类型转换。需要注意的是,只有相近类型之间才能发生隐式类型转换,不相近类型之间只能进行强制类型转换

2021dragon的博客 7517

C/C++数据类型转换详解

自动类型转换常被称为隐式类型转换,强制类型转换常被称为显示类型转换,强制类型转换的一般形式为(类型标识符)(操作数)或(类型标识符)(表达式)。其功能就是把操作数或表达式结果的数据类型暂时地强制转换为圆括号()中的类型。

weixin_44049823的博客 6977

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

如何选择类型 1)当数值不可能为负时,选择无符号类型。 2)当数值超过了int的表示范围时,选用long long。 3)在算术表达式中不要使用char或bool,只有在存放字符串或布尔值时才使用它们。因为类型char在一些机器中是有符号的,而在另一些机器中又是无符号的。如果...

148

C++】四种强制类型转换

C++ 四种强制类型转换   C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。  ...

Bob__yuan的博客 4万+

C++强制类型转换

C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。 (1)将浮点型数据赋值给整型变量时,舍弃其小数部分。 (2)将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。 (3)将double型数据赋值给float型变量时,注意数值范围溢出。 (4)字符型数据可以赋值给整型变量,此时存入的是字符的ASCII码。 (5)将一个int,short或long型数据赋值给一个char型变量,只

q610098308的专栏 6万+

C++四种强制类型转换

文章目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换C++的区别3 static_cast4 reinterpret_cast5 const_cast6 dynamic_cast6.1 向上转型(Upcasting)6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换

u_hcy2000的博客 1万+

C++类型转换

介绍C++中的类型转换,static_cast、reinterpret_cast、const_cast、dynamic_cast

YoungMLet的博客 2329

c++语言变量类型转换,c++中四种类型转换机制

C语言中存在着两种类型转换隐式转换和显式转换隐式转换:不同数据类型之间赋值和运算,函数调用传递参数…编译器完成char ch;int i = ch;隐式转换主要分为以下几类:1)算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。int ival = 3;double dval = 3.14159;ival + dval; ...

weixin_42502957的博客 1466

C/C++ (20. C++类型转换)

我为我喜爱的都东西大费周章, 所以我才能快乐如斯. --海明威<太阳照常升起> 20. C++类型转换 20.1 C语言中的类型转换 void Test (){ int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n" , i, d); int* p = &i; // 显示的强制类型转换 int addre...

Mind and Hand 522

改善C++ 程序的150个建议学习之建议11:将强制转型减到最少

建议11:将强制转型减到最少 C++ 在设计中一直强调类型安全,而且也采取了一定的措施来保障这条准则的执行。但是,从C继承而来的强制转型却破坏了C++类型系统,C中的强制转型可谓是“无所不能”,其超强的能力给C++带来了很大的安全隐患。强制转型会引起各种各样的麻烦,有时这些麻烦很容易被察觉,有时它们却又隐藏极深,难以察觉。 在C/C++语言中,强制转型是“一个你必须全神贯注才能正确使用”的特性

CodingAdo 1115

将一个负数赋值给一个无符号数会出现什么情况呢

在正文开始之前,我们先看一下下面这段看似简单的代码: #include &lt;stdio.h&gt; #include&lt;Windows.h&gt; int main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c...

学无止境 2万+

基本数据的自动类型转换和强制类型转换

package com.jredu.ch02; public class Ch03 { public static void main(String[] args) { // TODO Auto-generated method stub //在变量前加final关键字,这个变量就变成了常量(常量不能被修改) final int a = 0; final boole

博客之家 1092

c++ Primer学习笔记之第二章 变量和基本类型

1、  把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。 2、  char 1个字节,float 4个字节,double 8个字节,int分为long int和short int,其中long int是4个字节,short int是2个字节。int为整数型,用于定义整数类型的数据,float为单精度浮点型,能准确到小数点后六位,double为双精度浮点型,能

enen199202的专栏 554

GNSSdata_广播星历_广播星历计算_rinex3.04_星_RINEX_

数据为Rinex 3.03的多系统混合导航星历(截取部分)广播星历计算

合肥锻压机床总厂产YH32 1000 10000千牛四柱液压机程序.rar

PLC程序,三菱PLC

上一篇: 通过redis-rdb-tools分析redis内存使用量
下一篇: VS2010 设置打开项目、解决方案时左边目录中出现的Microsoft Visual Studio 2010中的project位置...
weixin_33860737
博客等级 码龄11年 3539粉丝 134原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值