嵌套宏展开和浮点数内存值位运算

来源:互联网 发布:淘宝三国杀武将牌 编辑:程序博客网 时间:2024/06/08 03:09
/// @file main.cpp/// @brief 嵌套宏展开和浮点数内存值位运算/// @note 做题感受, 以后一定要随身携带一个买菜用的计算器, 太坑了 :(#include <iostream>using namespace std;#define M(x) x*x+2*x#define PRINTF(num,k) num++; cout << k << endl;int main() {    int i = 0;    int k = M(M(4));    /**    /// 宏嵌套的展开    /// 宏展开时, 编译器先按照宏入参变量展开, 然后再套入的宏入参值!    /// 不能用宏入参值先套进宏进行展开, 算出的结果和编译器算出的不一样!    M(x) x*x+2*x    M(4) 4*4+4*4    M(y) = y*y+2*y    M(M(y)) = x*x+2*x = y*y+2*y*y*y+2*y+2*y*y+2*y        = y*y+2*y*y*y+2*y+2*y*y+2*y        = pow(y,2)+2*pow(y,3)+2*y+2*pow(y,2)+2*y        = 2*pow(y,3)+3*pow(y,2)+4*y    M(M(4)) = 2*pow(4,3)+3*pow(4,2)+4*4        = 2*64 + 3*16 + 16        = 128 + 48 + 16        = 176 + 16        = 192    k = M(M(4)) = 192 ///< ok    */    while (i < 3)        PRINTF(i,k);    /** 宏展开    while (i < 3)        i++;        /// 此时 i = 3, k不变 = 192      cout << k << endl; ///< 192    */    float f = -(float)(k+2)/3104;    /** 手算简单整数除法    f = -(float)(192 + 2)/3104 = -(float)194/3104 = -0.0625    */    /**    16进制对照表    1001 9    1010 A    1011 B    1100 C    1101 D    1110 E    1111 F    -0.0625f 转4字节内存表示 BD800000    BD800000 >> 18        = 1011,1101,1000,00 00,0000,0000,0000,0000 >> 18        = 10111101100000000000000000000000 >> 18        = 1011,1101,1000,00        = 1111,1111,1111,1111,1110,1111,0110,0000 符号位1补充左面移位    (BD800000 >> 18) & 0xff = 0110,0000 = 60    */    cout << hex << (((int&)f >> 18) & 0xFF) << endl; ///< 60    /// run result     /// 60    return 0;}/**-0.0625f 转4字节内存表示 BD800000S = 1(负数)整数部分 = 0B小数部分 = .0625f = .0001B  0.0625f = 0.0001B * pow(2,0) = 1.0B * pow(2,-4)E = 127 + (-4)(pow2,-4 's -4) = 123 = 01111011BD = 0B(1.0B 's 0B)  = 0B 补零(凑足23位)  = 000 0000 0000 0000 0000 0000  00000000000000000000000B  SED = 1, 01111011, 00000000000000000000000      = 10111101100000000000000000000000      = 1011,1101,1000,0000,0000,0000,0000,0000      = B    D    8    0    0    0    0    0      = BD800000  16进制对照表  1001 9  1010 A  1011 B  1100 C  1101 D  1110 E  1111 F  123转2进制表示 => 01111011  123/2  61        1  61/2  30        1  30/2  15        0  15/2  7         1  7/2  3         1  3/2  1         1小数部分转2进制表示.0001B  .0625f  *2  .1250         0  *2  .2500         0  *2  .50           0  *2  1.00  *//** 在计算机记事本上,不用计算器,手工计算简单整数除法194/3104    194         0.    / 3104    ----------    1940        0.0    / 3104    ----------    19400       0.06    / 3104*6    18624    ----------    776         0.06    / 3104    ----------    7760        0.062    / 3104*2    6208    ----------    1552        0.062    / 3104    ----------    15520       0.0625 ///< 商    / 3104*5    15520    ----------    0*/

0 0
原创粉丝点击