使用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提供的用来高精度计算的工具类 以下是对这个类的一个包 ...
随机推荐
- 指针,&的用法
#include "stdafx.h" #include <stdio.h> #include <string.h> int main() { ] = {, ...
- MYSQL数据库如何赋予远程某个IP访问权限
1. 授权用户root使用密码jb51从任意主机连接到mysql服务器:代码如下:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'jb ...
- Monkey测试4——Monkey命令行可用的全部选项
Monkey命令行可用的全部选项 常规 --help 列出简单的用法. -v 命令行的每一个-v将增加反馈信息的级别. Level 0(缺省值)除启动提示.测试完成和最终结果之外,提供较少信息. Le ...
- Java 经典实例: Unicode字符和String之间的转换
在Java诞生之际,Unicode码是一个16位的字符集,因此char值似乎顺其自然为16位宽,多年来一个char变量几乎可以表示任何Unicode字符. /** * Created by Frank ...
- cnodejs社区论坛4--话题列表
- java RSA加解密以及用途
在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...
- Spring MVC处理异常的4种方式
http://blog.csdn.net/ufo2910628/article/details/40399539 http://my.oschina.net/CandyDesire/blog/3333 ...
- 转【实战体验几种MySQLCluster方案】
实战体验几种MySQLCluster方案 1.背景 MySQL的cluster方案有很多官方和第三方的选择,选择多就是一种烦恼,因此,我们考虑MySQL数据库满足下三点需求,考察市面上可行的解决方案: ...
- spring常用注解使用解析
spring没有采用约定优于配置的策略,spring要求显示指定搜索哪些路径下的Java文件.spring将会把合适的java类全部注册成spring Bean. 问题:spring怎么知道把哪些 ...
- js获取本机的外网/广域网ip地址
完整源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...