使用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++,赋值运算时发生的转换的更多相关文章

  1. Effective C++ 笔记二 构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...

  2. C# 中的隐式类型转换(运算时的隐式转换)和显示类型转换

    区别: 隐式转换失败编译会报错. 显示转换有可能精度丢失. 根据项目的编译设置,显示转换溢出可能会报错,如果设置溢出且未使用checked检查,运行时如果发生溢出会产出未知的计算结果. 在数字运算时, ...

  3. 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  4. Effective C++: 02构造、析构、赋值运算

    05:了解C++默默编写并调用哪些函数 1:一个空类,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy构造函数.一个copy assignment操作符和一个析构函数.此外如果你没有声 ...

  5. 【揭秘】C语言类型转换时发生了什么?

    ID:技术让梦想更伟大 作者:李肖遥 链接:https://mp.weixin.qq.com/s/ZFf3imVaJgeesuhl1Kn9sQ 在C语言中,数据类型指的是用于声明不同类型的变量或函数的 ...

  6. 【已解决】Https请求——基础连接已经关闭 发送时发生错误

    本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...

  7. 0xC0000005: 读取位置 0x00000000 时发生访问冲突

    遇见这种问题一般都是空指针,即:指针里没有赋值~ 如果你对null 进行操作就会产生空指针异常 Object obj = new Object(); 你要知道 obj是一个Object指针变量,指向O ...

  8. C++中的构造函数,拷贝构造函数和赋值运算

    关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...

  9. Double 类型运算时的精度问题

    double 类型运算时的 计算的精度不高,常常会出现0.999999999999999这种情况,那么就须要用BigDecimal   它是java提供的用来高精度计算的工具类 以下是对这个类的一个包 ...

随机推荐

  1. Oracle数据库,模糊查询、去重查询

    分组去重查询,并执行某一个函数 :select  分组字段,聚合函数 from 表名 where 条件 group by分组字段 select 分组字段,聚合函数 from 表名 where 条件 g ...

  2. FPGA中的delay与latency

    delay和latency都有延迟的意义,在FPGA中二者又有具体的区别. latency出现在时序逻辑电路中,表示数据从输入到输出有效经过的时间,通常以时钟周期为单位. delay出现在组合逻辑电路 ...

  3. Guava学习笔记:Guava新增集合类型-Multiset

    Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口.Guava中定义的新集合有: Multi ...

  4. 神奇的Bank系统之旅哦

        奋斗不能等待,我们不能等到垂暮之年再去“全力以赴”.让我们从现在开始,为理想而努力,为人生而拼搏.精诚所至,金石为开,相信奋斗会让我们的青春之花绽放得更加绚烂,让我们的人生之路走下来不留遗憾. ...

  5. 通过rsync+inotify实现数据实时备份同步

    一.环境描述 测试环境 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 环境描述: 主服务器172.26.7.50 ,从 ...

  6. CSS实现DIV水平 垂直居中-1

    水平大家都知道,一般固定宽度给个margin:0 auto:就可以了.下面实现水平垂直都居中 HTML <div class="parent"> </div> ...

  7. javscript闭包的准备工作 -- 作用域与作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  8. 精通 CSS 选择器

    CSS 选择器除了样式表匹配元素时需要用到,在使用 jQuery 等库的时候也可以利用 CSS 选择器来选择元素,因此作为前端开发需要熟练掌握.下面是一些常用的 CSS 选择器示例. 元素选择器 E, ...

  9. 微信不支持Object.assign

    微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  10. 利用ARCHPR明文破解获取PDF

    我们经常下载一些rar或zip压缩文件,解压时有时发现要密码,而密码多是为了推广而设置的网址等,如果不知道密码,可 以去来源网站上寻找或在压缩文件的注释中查看. 而并非所有都是如此,例如,网上有些人, ...