• c++中按位取反


     
    1. #include <stdio.h>  
    2. #include <iostream>  
    3.   
    4. using namespace std;  
    5.   
    6. void main()  
    7. {  
    8.       
    9.     //做这类题目抓住两点:第一、无论是以进制表示还是整数形式赋值给变量,都要根据变量相应  
    10.     //的数据类型,表示为补码的形式存储进计算机内存中;第二、无论是在做数据类型强制转换(  
    11.     //内存存储形式没有改变,这一点可以通过查看Memory得到)还是做位运算的时候,实际上都是对  
    12.     //内存中存储的数进行的操作(也可以查看Memory得到),至于呈现的时候就是根据设定的数据类  
    13.     //型把内存中存储的二进制数字进行相应规则的呈现即可  
    14.   
    15.     //cout << sizeof(long long) << endl;  
    16.   
    17.     //注意,计算机存储的都是数的补码,无论是正数还是负数,另外要注意数据类型的长度  
    18.     short int a = 0x8000;//有符号数则表示-32768(计算机就存这个数,它是补码,要算实际代表的数要运算)  
    19.     short int b = 0x7000;//有符号数表示28672  
    20.     unsigned short int c = 0x8000;//无符号数则表示32768,是正数  
    21.   
    22.     short int d = c;  
    23.     unsigned short int e = a;  
    24.   
    25.     cout << a << endl;//应输出-32768,因为是有符号数  
    26.     cout << b << endl;//应输出28762,应为是正数  
    27.     cout << c << endl;//应输出32768,因为是无符号数  
    28.     cout << d << endl;//应输出-32768,因为强制转换成了有符号数  
    29.     cout << e << endl;//应输出32768,因为强制转换成了无符号数  
    30.     //感觉强制转换的时候在内存存储形式并没有任何改变,只是呈现的形式改变而已,按照需要的数据类型格式进行呈现  
    31.     //任何的位操作都是对内存中存储的数进行的操作。  
    32.   
    33.     short int pre = -3;                 //在内存中的表示为1111 1111 1111 1101是它的补码形式,即0xfffd  
    34.     unsigned short int trans = pre;     //0xfffd无符号数应表示的是65533,注意内存内形式不变  
    35.     short int m = ~pre;                 //直接操作的是内存中存储的形式,按位取反后是0000 0000 0000 0010,即0x0002  
    36.     unsigned short int n = ~pre;        //实际上之后的形式还是0x0002  
    37.   
    38.     cout << pre << endl;  
    39.     cout << trans << endl;  
    40.     cout << m << endl;  
    41.     cout << n << endl;  
    42.   
    43.     cout << "/*********************************************************************************/" << endl;  
    44.     unsigned char ch = 'F';  
    45.     //其实下面一行代码做了三步操作  
    46.     //第一、首先把ch按位取反,之后在内存中的形式变为1011 1001  
    47.     //第二、把内存中的这个值先进行扩位,扩充成short类型的,扩位的时候是看做有符号数进行的,  
    48.     //扩位之后为1111 1111 1011 1001,即:0xffb9  
    49.     //第三、把0xffb9按照无符号数规则进行呈现  
    50.     unsigned short int p = ~ch;  
    51.     unsigned short int q = (unsigned)~ch;  
    52.   
    53.     cout << ch << endl;  
    54.     cout << p << endl;  
    55.     cout << q << endl;  
    56.   
    57.     cout << "/**************************************************************************/" << endl;  
    58.     unsigned short int p1;  
    59.     short int p2;  
    60.       
    61.     //有符号字符扩充为无符号和有符号short int  
    62.     char ch1 = 'F';  
    63.     p1 = ~ch1;  
    64.     p2 = ~ch1;  
    65.     cout << p1 << endl;  
    66.     cout << p2 << endl;  
    67.   
    68.     //无符号字符扩充为无符号和有符号short int  
    69.     unsigned char ch2 = 'F';  
    70.     p1 = ~ch2;  
    71.     p2 = ~ch2;  
    72.     cout << p1 << endl;  
    73.     cout << p2 << endl;  
    74.   
    75.   
    76.     /******测试有符号数和无符号数的强制转换和扩位******/  
    77.     cout << "/**************************************************************************/" << endl;  
    78.     int nn = 0;  
    79.     unsigned int nn1 = 0;  
    80.   
    81.     //无符号数(正)扩充为有符号数和无符号数  
    82.     unsigned short int mm1 = 0x7000;  //28672  
    83.     nn = ~mm1;  
    84.     nn1 = ~mm1;  
    85.   
    86.     cout << nn << endl;   
    87.     cout << nn1 << endl;   
    88.   
    89.     short int aaa = 0x8000;  
    90.     long long bbb = ~aaa;  
    91.   
    92.     //无符号数(负)扩充为有符号数和无符号数  
    93.     unsigned short int mm3 = 0x8000;   //32768  
    94.     nn = mm3;  
    95.     nn1 = mm3;  
    96.   
    97.     cout << nn << endl;  
    98.     cout << nn1 << endl;  
    99.   
    100.     //有符号数(正)扩充为有符号数和无符号数  
    101.     short int mm2 = 0x7000;             //+28672  
    102.     nn = mm2;  
    103.     nn1 = mm2;  
    104.   
    105.     cout << nn << endl;  
    106.     cout << nn1  << endl;  
    107.   
    108.     //有符号数(负)扩充为有符号数和无符号数  
    109.     short int mm4 = 0x8000;             //-32768  
    110.     nn = mm4;  
    111.     nn1 = mm4;  
    112.   
    113.     cout << nn << endl;  
    114.     cout << nn1  << endl;  
    115.   
    116. }  
  • 相关阅读:
    一次springboot applicationContext.getBean(clazz)空指针
    Dubbo返回自定义异常之UndeclaredThrowableException、InvocationTargetException
    MyBatis源码学习计划
    MySQL分组修改排序序号
    查看Linux服务器连接数,Oracle表和索引分析
    转载:查看Oracle连接数
    转载:查看ORACLE最耗时的SQL
    java 获取网络图片
    java POI html生成word(html里面带图片,Linux系统导出图片无法显示)
    java解决poi导出excel使用SXSSF时“Attempting to write a row[?] in the range [0,?]that is already written to disk.”异常
  • 原文地址:https://www.cnblogs.com/xrcun/p/2797061.html
Copyright © 2020-2023  润新知