前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++中按位取反_取反和按位取反

c++中按位取反_取反和按位取反

作者头像
全栈程序员站长
发布2022-09-21 10:35:19
1.3K0
发布2022-09-21 10:35:19
举报

大家好,又见面了,我是你们的朋友全栈君。

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. void main()
  5. {
  6. //做这类题目抓住两点:第一、无论是以进制表示还是整数形式赋值给变量,都要根据变量相应
  7. //的数据类型,表示为补码的形式存储进计算机内存中;第二、无论是在做数据类型强制转换(
  8. //内存存储形式没有改变,这一点可以通过查看Memory得到)还是做位运算的时候,实际上都是对
  9. //内存中存储的数进行的操作(也可以查看Memory得到),至于呈现的时候就是根据设定的数据类
  10. //型把内存中存储的二进制数字进行相应规则的呈现即可
  11. //cout << sizeof(long long) << endl;
  12. //注意,计算机存储的都是数的补码,无论是正数还是负数,另外要注意数据类型的长度
  13. short int a = 0x8000;//有符号数则表示-32768(计算机就存这个数,它是补码,要算实际代表的数要运算)
  14. short int b = 0x7000;//有符号数表示28672
  15. unsigned short int c = 0x8000;//无符号数则表示32768,是正数
  16. short int d = c;
  17. unsigned short int e = a;
  18. cout << a << endl;//应输出-32768,因为是有符号数
  19. cout << b << endl;//应输出28762,应为是正数
  20. cout << c << endl;//应输出32768,因为是无符号数
  21. cout << d << endl;//应输出-32768,因为强制转换成了有符号数
  22. cout << e << endl;//应输出32768,因为强制转换成了无符号数
  23. //感觉强制转换的时候在内存存储形式并没有任何改变,只是呈现的形式改变而已,按照需要的数据类型格式进行呈现
  24. //任何的位操作都是对内存中存储的数进行的操作。
  25. short int pre = -3; //在内存中的表示为1111 1111 1111 1101是它的补码形式,即0xfffd
  26. unsigned short int trans = pre; //0xfffd无符号数应表示的是65533,注意内存内形式不变
  27. short int m = ~pre; //直接操作的是内存中存储的形式,按位取反后是0000 0000 0000 0010,即0x0002
  28. unsigned short int n = ~pre; //实际上之后的形式还是0x0002
  29. cout << pre << endl;
  30. cout << trans << endl;
  31. cout << m << endl;
  32. cout << n << endl;
  33. cout << “/*********************************************************************************/” << endl;
  34. unsigned char ch = ‘F’;
  35. //其实下面一行代码做了三步操作
  36. //第一、首先把ch按位取反,之后在内存中的形式变为1011 1001
  37. //第二、把内存中的这个值先进行扩位,扩充成short类型的,扩位的时候是看做有符号数进行的,
  38. //扩位之后为1111 1111 1011 1001,即:0xffb9
  39. //第三、把0xffb9按照无符号数规则进行呈现
  40. unsigned short int p = ~ch;
  41. unsigned short int q = (unsigned)~ch;
  42. cout << ch << endl;
  43. cout << p << endl;
  44. cout << q << endl;
  45. cout << “/**************************************************************************/” << endl;
  46. unsigned short int p1;
  47. short int p2;
  48. //有符号字符扩充为无符号和有符号short int
  49. char ch1 = ‘F’;
  50. p1 = ~ch1;
  51. p2 = ~ch1;
  52. cout << p1 << endl;
  53. cout << p2 << endl;
  54. //无符号字符扩充为无符号和有符号short int
  55. unsigned char ch2 = ‘F’;
  56. p1 = ~ch2;
  57. p2 = ~ch2;
  58. cout << p1 << endl;
  59. cout << p2 << endl;
  60. /******测试有符号数和无符号数的强制转换和扩位******/
  61. cout << “/**************************************************************************/” << endl;
  62. int nn = 0;
  63. unsigned int nn1 = 0;
  64. //无符号数(正)扩充为有符号数和无符号数
  65. unsigned short int mm1 = 0x7000; //28672
  66. nn = ~mm1;
  67. nn1 = ~mm1;
  68. cout << nn << endl;
  69. cout << nn1 << endl;
  70. short int aaa = 0x8000;
  71. long long bbb = ~aaa;
  72. //无符号数(负)扩充为有符号数和无符号数
  73. unsigned short int mm3 = 0x8000; //32768
  74. nn = mm3;
  75. nn1 = mm3;
  76. cout << nn << endl;
  77. cout << nn1 << endl;
  78. //有符号数(正)扩充为有符号数和无符号数
  79. short int mm2 = 0x7000; //+28672
  80. nn = mm2;
  81. nn1 = mm2;
  82. cout << nn << endl;
  83. cout << nn1 << endl;
  84. //有符号数(负)扩充为有符号数和无符号数
  85. short int mm4 = 0x8000; //-32768
  86. nn = mm4;
  87. nn1 = mm4;
  88. cout << nn << endl;
  89. cout << nn1 << endl;
  90. }

分享到:

转载于:https://www.cnblogs.com/xrcun/archive/2012/12/01/2797061.html

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170478.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档