unsigned char i=0x80; printf("0x%x\n", ~i>>3+1);//无符号16进制输出 char ci=0x80;

古戎烽烟 2015-08-20 11:17:35
unsigned char i=0x80;
printf("0x%x\n", ~i>>3+1);//无符号16进制输出
char ci=0x80;
printf("0x%x\n", ~ci>>3+1);
结果分别为 0x fffffff7 0x7
...全文
745 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-08-21
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c
fly_dragon_fly 2015-08-21
  • 打赏
  • 举报
回复
1) 移位操作优先级最低, 所以都是右移4位, 取反优先级最高, 最先做 2) 整形提升, uchar会提升到uint, 而char会提升到int, 所以0x80在uint中还是0x80, 而在int为0xffffff80, 它们取反的结果就不同了
二班的码农 2015-08-20
  • 打赏
  • 举报
回复
取反操作前,字符型数据会自动转成整形 即 i = 0x00000080 ~i 为 0xffffff7f ~i>>3+1 由于+号运算符优先级比>>位移运算符高,所以~i>>3+1等价于~i>>4,则得到0xfffffff7 ci变量也一样,先转换成整形,为0xffffff80(因为ci为有符号型字符变量,且符号位为1,转成整形时,高位补1) 之后同理

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧