c++算术运算和位运算中类型转换和类型提升规则和方法

[cpp]  view plain copy
  1. <pre class="html" name="code">#include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. void main()  
  6. {  
  7.     /************************************************************************/  
  8.     /* 结论: 
  9.         Memory中存储的是补码,是根据存入的具体数据的值进行转换为二进制 
  10.         后的形式,如果超过该数据类型范围则不知道存的形式是什么了,这个 
  11.         应该是编译器相关的,对越界数的处理方式;(无论存入的时候是用什 
  12.         么进制表示的,在这里注意+/-单目运算符的作用) 
  13.  
  14.         无论要做什么运算都要先看这个数存入内存是什么样子的; 
  15.  
  16.         类型提升/截断的时候都是对内存中数据的操作,提升的时候就是需要 
  17.         进行扩位:对无符号数扩位的时候直接把扩出的位上补零即可(因为unsigned都是正数);有符号 
  18.         数进行扩位,则进行符号位扩展(sign extension)如果是整数即原最高位 
  19.         是零则补零,如果是负数即原最高位是1则全补1;进行数据截断的时候是 
  20.         从低位开始数位数然后截断,这里注意我们使用的一般都是小端机(little Endian) 
  21.          
  22.         类型强制转换其实也是对内存中存储的数据的一种呈现方式而已,如:内存 
  23.         中是8000的时候(即1000 0000 0000 0000),如果用unsigned short int则打印出 
  24.         来的是2的15次方,如果用short int则打印出来是负2的16次方 
  25.          
  26.         在进行算术运算和双目的位运算的时候如果操作数数据类型不一致,首先进 
  27.         行数据 Arithmetical Conversion类型提升(其实提升就是进行扩位,然后把扩位后的内存二进制代码强制转为某种数据类型之后进行打印),然后       才开始运算 
  28.          
  29.         在进行单目位运算的时候,首先进行整型提升,然后开始运算Integer Promotion*/  
  30.     /************************************************************************/  
  31.     //目的:计算机内部存储形式(无符号数、有符号正数、有符号负数、直接十六进制;及其  
  32.     //扩位后规则及其扩位后的存储形式)  
  33.     unsigned char uch1 = 0x80; //80  
  34.     unsigned char uch2 = 128;  //80   
  35.   
  36.     //注意+/-作为单目运算符的作用和意义,就是让存入内存的时候,最高位写为1  
  37.     //同时要注意各个数据类型的表示范围  
  38.     char sch1 = -0x7f; //Memory中应该是81  
  39.     char sch2 = 0x80;   
  40.     cout << (short int)sch1 << endl;//-127  
  41.     cout << (short int)sch2 << endl;//-128  
  42.   
  43.     unsigned usch3 = 0x7f;  
  44.     unsigned ushc4 = 0x80;  
  45.     cout << (short int)usch3 << endl;//127  
  46.     cout << (short int)ushc4 << endl;//128  
  47.   
  48.     char sch3 = 127;  
  49.     char sch4 = -128;  
  50.     cout << (short int)sch3 << endl;//127  
  51.     cout << (short int)sch4 << endl;//-128  
  52.   
  53.     unsigned uch3 = 0;  
  54.     unsigned uch4 = 255;  
  55.     cout << (short int)uch3 << endl;//0  
  56.     cout << (short int)uch4 << endl;//255  
  57.   
  58.     char a = -0x80;  
  59.     short int b = 0x7f80;  
  60.     short int result = a&b;//0111 1111 1000 0000  
  61.   
  62.     cout << result <<endl;  
  63.   
  64. }</pre><br>  
  65. <pre></pre>  
  66. <pre></pre>  
转自http://blog.csdn.net/gukesdo/article/details/6909766
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值