使用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. SOA (面向服务的体系结构)

    面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言 ...

  2. springmvc 配置多视图,返回jsp,velocity,freeMarker,tiles(模板)等等

    springmvc-servlet.xml配置 <!-- Velocity --> <bean id="velocityViewResolver" class = ...

  3. [moka同学笔记]MySql语句整理

    更改单个表中的字段属性 content 以前为text类型的,现在改为longtext ALTER TABLE `notice` CHANGE `content` `content` LONGTEXT ...

  4. 七个结构模式之桥接模式(Bridge Pattern)

    问题: 当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响. 定义: 将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分 ...

  5. 不简单的SQL查询和排序语句

    真不简单!! 一:使用select语句进行查询 语法: SELECT    <列名> FROM      <表名> [WHERE    <查询条件表达式>] [OR ...

  6. jQuery 浮动标签插件,帮助你提升表单用户体验

    浮动标签模式(Float Label Pattern)是最新流行的一种表单输入域的内容提示方式,当用户在输入框输入内容的时候,原先占位符的内容向上移动,显示在输入的内容的上面.这里推荐的这款 jQue ...

  7. 经典网页设计:20个与众不同的国外 HTML5 网站

    大家都都知道, HTML5 具备所有最新的技术和功能,帮助我们创造平滑过渡,花式图像滑块和动画.如果你正在考虑使用HTML5 来设计自己的网站,那么这个集合能够帮助你. 在过去的10年里,网页设计师使 ...

  8. angularjs 指令—— 绑定策略(@、=、&)

    angularjs 指令—— 绑定策略(@.=.&) 引入主题背景:angular 的指令配置中的template可以直接使用硬编码写相应的代码,不过也可以根据变量,进行动态更新.那么需要用到 ...

  9. 系统安装LOL等游戏后出现VS调试报错"无法调试""拒绝访问"之类的调试错误

    一个问题抠得脑壳痛,度娘一番各种各样的答案.基本属于 1,调试权限被清0 2,文件权限问题   其中看到很多解决方案中提到"重启电脑"的说法.我也试了几次不行甚至游戏都卸载了.后来 ...

  10. 从零开始,做一个NodeJS博客(零):整体规(chui)划(niu)

    标签:NodeJS,Heroku 0 搭建一个个人独立博客,这是我好久之前就在计划的一件事了. 这个暑假,我学习了廖雪峰老师的NodeJS教程,又偶然在V2EX上发现了Heroku这个平台,可以免费在 ...