int d =-2; printf("*d(4)=%o*d(5)=%-7o*\n",d,d,d)详解

这个东西输出啥?
没接触过,刚开始学。来个大佬讲一下。

阅读 2.3k
1 个回答

这个其实有一些问题,在编译期可能不能发现,因为printf支持不定数参数,但给的参数数量有多余的。

printf格式化替换变量,其中%o是以八进制形式输出无符号整数(不输出前缀0),这里定义的d是有符号的负数,在实际存储中会以补码的形式存储,所以输出时实际输出的是对应补码的八进制数据,%-7o则是说以7个字符宽度右对齐输出八进制无符号整数,因为这里只用到2个d变量值,所以说有运行期问题。
-2int(32bit)类型原码是
原码是 1000 0000 0000 0000 0000 0000 0000 0010
反码是 1111 1111 1111 1111 1111 1111 1111 1101
补码是 1111 1111 1111 1111 1 111 111 1 11 11 1 110
补码对应八进制表示是:

  `37777777776`

大致屏幕实际输出是:
*d(4)=37777777776*d(5)=37777777776*
如果是16bit环境,则里面int是16bit时,输出为
*d(4)=177776*d(5)= 177776*

即这个题的输出需要在16bit中才能表现出差异。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题