使用C/C++,赋值运算时发生的转换
使用C/C++,赋值运算时发生的转换主要有以下四种情况
一: 两边类型不同;
结果: 自动完成类型转换!
二: 长数赋给短数;
结果: 截取长数的低位送给短数!
三: 短数赋给长数;
结果: 原来是什么数,现在还是什么数!
四: 符号位的赋值处理;
结果: 直接处理,不管符号位还是数字位;
#--------------------------------------------------------------------------------------------------------------------------#
第一种情况:两边类型不同
这种情况最为常见,大家应该都已经遇到过。
举例:
#include<iostream>
using namespace std; int main()
{
int int_i = 64.14159; //int_i = 64
char char_i = int_i; //char_i = '@'
float float_i = char_i; //float_i = 64
bool bool_i = float_i; //bool_i = 1
cout << showpoint << int_i <<" "<< char_i <<" "<< float_i <<" "<< bool_i << endl;
//输出:64 @ 64.0000 1
return ;
}
第二种情况:长数赋给短数
截取长数的低n位给短数!这种情况特别容易出错。
举例:
#include<iostream>
#include<bitset>
#include<iomanip>
using namespace std; int main()
{
int int_i = ;
char char_a = int_i;
cout << int_i << endl;
cout << char_a << endl;
//输出:865
// a bitset<sizeof(int)*> bin_i(int_i); //将int_i以二进制形式输出
bitset<sizeof(char)*> bin_a(char_a);//将char_a以二进制形式输出
cout << setw() << bin_i << endl;
cout << setw() << bin_a << endl;
//输出:00000000000000000000001101100001
// 01100001 return ;
}
由于char 类型只占1个byte(8 bits), 而int 类型占4个byte(32 bits)(int 在有些环境可能是2个byte), 故char_a 只得到了int_a 的末八位的值!
第三种情况:短数赋给长数
这种情况最简单,原来是什么数,现在还是什么数。
举例:
#include<iostream>
#include<bitset>
#include<iomanip>
using namespace std; int main()
{
short short_i = ;
long long_i = short_i;
cout << short_i << endl;
cout << long_i << endl;
//输出:123
// 123 bitset<sizeof(short)*> bin_short_i(short_i); //将short_i以二进制形式输出
bitset<sizeof(long)*> bin_long_i(long_i); //将long_i以二进制形式输出
cout << setw() << bin_short_i << endl;
cout << setw() << bin_long_i << endl;
//输出: 0000000001111011
// short short_j = -;
long long_j = short_j;
cout << short_j << endl;
cout << long_j << endl;
//输出:-123
// -123 bitset<sizeof(short)*> bin_short_j(short_j); //将short_j以二进制形式输出
bitset<sizeof(long)*> bin_long_j(long_j); //将long_j以二进制形式输出
cout << setw() << bin_short_j << endl;
cout << setw() << bin_long_j << endl;
//输出: 1111111110000101
// return ;
}
这里需要注意的是:
如果short型数为无符号数,则long型的高16位补0;
如果short型数为有符号数:
- 当short型最高位为0时,long型的高16位补0;
- 当short型最高位为1时,long型的高16位补1;当然这是为了保证long型的值与short型的值相同,因为负数存的是补码,求值方法是反码+1;
第四种情况:符号位的赋值处理
这种情况也好处理,不管符号位还是数字位,都直接赋值!
举例:
#include<iostream>
#include<bitset>
#include<iomanip>
using namespace std; int main()
{
unsigned int unsigned_int_i = 0xAAAAAAAA;
signed int signed_int_j = unsigned_int_i;
cout << unsigned_int_i << endl;
cout << signed_int_j << endl;
//输出:2863311530
// -1431655766 bitset<sizeof(unsigned int)*> bin_i(unsigned_int_i); //将unsigned_i以二进制形式输出
bitset<sizeof(signed int)*> bin_j(signed_int_j);//将signed_j以二进制形式输出
cout << setw() << bin_i << endl;
cout << setw() << bin_j << endl;
//输出:10101010101010101010101010101010
// return ;
}
#---------------------------------------------------------------------------------#
参考文献
cousera course: Introduction to Computing, by Li Ge
使用C/C++,赋值运算时发生的转换的更多相关文章
- Effective C++ 笔记二 构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...
- C# 中的隐式类型转换(运算时的隐式转换)和显示类型转换
区别: 隐式转换失败编译会报错. 显示转换有可能精度丢失. 根据项目的编译设置,显示转换溢出可能会报错,如果设置溢出且未使用checked检查,运行时如果发生溢出会产出未知的计算结果. 在数字运算时, ...
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- Effective C++: 02构造、析构、赋值运算
05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声 ...
- 【揭秘】C语言类型转换时发生了什么?
ID:技术让梦想更伟大 作者:李肖遥 链接:https://mp.weixin.qq.com/s/ZFf3imVaJgeesuhl1Kn9sQ 在C语言中,数据类型指的是用于声明不同类型的变量或函数的 ...
- 【已解决】Https请求——基础连接已经关闭 发送时发生错误
本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...
- 0xC0000005: 读取位置 0x00000000 时发生访问冲突
遇见这种问题一般都是空指针,即:指针里没有赋值~ 如果你对null 进行操作就会产生空指针异常 Object obj = new Object(); 你要知道 obj是一个Object指针变量,指向O ...
- C++中的构造函数,拷贝构造函数和赋值运算
关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...
- Double 类型运算时的精度问题
double 类型运算时的 计算的精度不高,常常会出现0.999999999999999这种情况,那么就须要用BigDecimal 它是java提供的用来高精度计算的工具类 以下是对这个类的一个包 ...
随机推荐
- PopupWindow的使用
如图是效果图 2种常用PopupWindow的使用 下载地址:http://download.csdn.net/detail/qq_29774291/9683258 第一个展示一个下拉的Lis ...
- 2016年湖南省第十二届大学生计算机程序设计竞赛Problem A 2016 找规律归类
Problem A: 2016 Time Limit: 5 Sec Memory Limit: 128 MB Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) ...
- Windows台的FailOver群集简介
首先,您需要有一些服务器硬件方面知识. 我们介绍Windows平台的FailOver群集,以多个站点场景为例,如下图示: 八个结点NODE,Windows的FailOver群集,依赖SAN存储同步各个 ...
- Android 手机卫士6--高级工具
1.包含内容 高级工具:归属地查询:常用号码查询:短信备份: 2.归属地查询 ①拷贝数据库 SQLiteDatabase不支持直接从assets读取文件,所以要提前拷贝数据 ②电话归属地在手机窗体上悬 ...
- Redis-持久化
Redis 持久化 Redis 提供了不同持久化范围的选项: RDB 持久化以指定的时间间隔执行数据集的即时点(point-in-time)快照. AOF 持久化在服务端记录每次收到的写操作,在服务器 ...
- sql2012还原sql2008备份文件语句
--sql2012还原sql2008语句 --选择master数据库,新建查询 输入下面sql语句 --选择兼容模式(sql 2008)创建数据库db RESTORE DATABASE db FROM ...
- 一个ORM的实现(附源代码)
1 前言 经过一段时间的编写,终于有出来一个稳定的版本,期间考虑了多种解决方案也偷偷学了下园子里面大神们的作品. 已经有很多的ORM框架,为什么要自己实现一个?我的原因是在遇到特殊需求时,可以在ORM ...
- 【web前端面试题整理06】成都第一弹,邂逅聚美优品
前言 上周四回了成都,休息了一下下,工作问题还是需要解决的,于是今天去面试了一下,现在面试回来了,我感觉还是可以整理一下心得. 这个面试题整理系列是为了以后前端方面的兄弟面试时候可以得到一点点帮助,因 ...
- VS2012 asp.net mvc 4 运行项目提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败"
创建mvc4 应用程序发布,运行出错.出现未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭,后来找得解决方法: 打开点站的web.confg文件,将: <authorizati ...
- 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService... 匹配的导出 VS2012报错
刚安装完VS2012,打开VS2012新建项目,但是并没有像之前那样顺利的创建页面,而是弹出了一个错误窗口. 我的系统是win7旗舰版 64位 ,同时安装了VS2010和VS2012.然后我又试了一下 ...