使用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. 基于TCP和多线程实现无线鼠标键盘-Socket(2)

    在(1)中,实现了Windows服务端与Android客户端的连接,本节将实现在Windows服务端与Android客户端之间传递数据. Android客户端的发送线程SendThread.java代 ...

  2. WebSocket 学习笔记--IE,IOS,Android等设备的兼容性问题与代码实现

    一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏览器来实现,其中数据通信,准备使用WebSocket的方式.于是,我开始 ...

  3. js从外部获取图片

    图片ping:图片可以从任何URL中加载,所以将img的src设置成其它域的URL,即可以实现简单的跨域,可以使用onload和onerror事件来确定是否接受到了响应 var img=new Ima ...

  4. Exif.js 读取图像的元数据

    Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. 注意事项: EXIF 数据主要来自拍摄的照 ...

  5. CSS尺寸单位 % px em rem 详解

    在CSS中,尺寸单位分为两类:相对长度单位和绝对长度单位.相对长度单位按照不同的参考元素,又可以分为字体相对单位和视窗相对单位.字体相对单位有:em.ex.ch.rem:视窗相对单位有:vw.vh.v ...

  6. PHP5 各版本维护时间

    版本维护: 5.2:维护至:2011-01-06.支持:xp(2003)以上.最终版本:5.2.17. 5.3:维护至:2014-08-14.支持:xp(2003)以上.最终版本:5.3.29 5.4 ...

  7. JavaScript学习笔记-实例详解-类(一)

    实例详解-类(一): //每个javascript函数(除了bind())都自动拥有一个prototype对象// 在未添加属性或重写prototype对象之前,它只包含唯一一个不可枚举属性const ...

  8. PHP美元符和花括号组合那些事—${${}}

    双美元符+{}:${${variable}}是一种比较常见的用法,但是它的实现原理是什么呢?今天来探究一下: 提及这种用法,还得先说一下PHP的String类型php.net上指出,一个字符串可以用4 ...

  9. Autodesk 招人了,开发顾问,感兴趣的或者有推荐的人扔简历过来啊

    Autodesk ADN招人了,在上海,开发顾问, JD如下. 如果你感兴趣或者有人推荐,扔简历过来啊, daniel.du@autodesk.com,赶早不赶晚啊.   Job Title: Dev ...

  10. ios7 tableview被navigationbar挡住

    用ego下拉刷新的时候,每次在ios7时,tableview都会上移...导致被navagationbar挡住.ios6是正常的,于是在init的时候添加如下代码... NSComparisonRes ...