c++算术运算和位运算中类型转换和类型提升规则和方法 .
2013-08-08 16:55:24
转自:CSDNgukesdo的专栏
结论:
Memory中存储的是补码,是根据存入的具体数据的值进行转换为二进制后的形式,如果超过该数据类型范围则不知道存的形式是什么了,这个应该是编译器相关的,对越界数的处理方式;
(无论存入的时候是用什么进制表示的,在这里注意+/-单目运算符的作用)无论要做什么运算都要先看这个数存入内存是什么样子的;
类型提升/截断的时候都是对内存中数据的操作,提升的时候就是需要进行扩位:对无符号数扩位的时候直接把扩出的位上补零即可(因为unsigned都是正数);
有符号数进行扩位,则进行符号位扩展(sign extension)如果是整数即原最高位是零则补零,如果是负数即原最高位是1则全补1;
进行数据截断的时候是从低位开始数位数然后截断,这里注意我们使用的一般都是小端机(little Endian)类型强制转换其实也是对内存中存储的数据的一种呈现方式而已,如:内存中是8000的时候(即1000 0000 0000 0000),如果用unsigned short int则打印出来的是2的15次方,如果用short int则打印出来是负2的16次方在进行算术运算和双目的位运算的时候如果操作数数据类型不一致,首先进行数据 Arithmetical Conversion类型提升(其实提升就是进行扩位,然后把扩位后的内存二进制代码强制转为某种数据类型之后进行打印),然后才开始运算在进行单目位运算的时候,首先进行整型提升,然后开始运算Integer Promotion
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>

浙公网安备 33010602011771号