这个其实有一些问题,在编译期可能不能发现,因为printf支持不定数参数,但给的参数数量有多余的。printf格式化替换变量,其中%o是以八进制形式输出无符号整数(不输出前缀0),这里定义的d是有符号的负数,在实际存储中会以补码的形式存储,所以输出时实际输出的是对应补码的八进制数据,%-7o则是说以7个字符宽度右对齐输出八进制无符号整数,因为这里只用到2个d变量值,所以说有运行期问题。-2的int(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中才能表现出差异。
这个其实有一些问题,在编译期可能不能发现,因为printf支持不定数参数,但给的参数数量有多余的。
printf格式化替换变量,其中
%o
是以八进制形式输出无符号整数(不输出前缀0),这里定义的d是有符号的负数,在实际存储中会以补码的形式存储,所以输出时实际输出的是对应补码的八进制数据,%-7o
则是说以7个字符宽度右对齐输出八进制无符号整数,因为这里只用到2个d
变量值,所以说有运行期问题。-2
的int
(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
补码对应八进制表示是:
大致屏幕实际输出是:
*d(4)=37777777776*d(5)=37777777776*
如果是16bit环境,则里面int是16bit时,输出为
*d(4)=177776*d(5)= 177776*
即这个题的输出需要在16bit中才能表现出差异。