杞人忧天文言文道理:C语言有关负整型数据输出的问题

来源:百度文库 编辑:高校问答 时间:2024/05/03 07:37:08
在教材中看到一到Printf函数在输出-1时,为什么以%o和%x输出会以补码的形式输出,而以%d输出时,而是-1,此时它是用原码吗?
这个问题我也是琢磨了一段时间,初步分析是这个可能的结果,真正的谜底可能就与库函数printf有关,期待高手进一步刨析......

在机器中,所有的数都是以补码的形式存储的
输出的形式不代表存储的形式

你应该知道printf函数的第一个参数叫做什么名字(格式字符串),说白了,printf是根据这个字符串来格式那个数字的!你要什么格式,它就输出什么格式。

你用%d输出,它定义的%d就是输出正负号和十进制整数值。你用%o输出,它定义就是不管什么负号不负号的把八进制输出出来。然而printf没有定义带符号八进制的输出格式字串而已(因为没有人习惯看到一个负的八进制或十六进制字符,只是感兴趣除外)

其实,没有必要去琢磨printf到底是怎么输出的,在你能看到的层面上,机器处理数据都是16进制的,而且是没有+-的,你用反汇编软件,用WinHex,用UtralEdit打开一个文件,你看到的最多是十六进制,你看到二进制没有意义的,你看不明白,你也不需要看明白。

即使说printf的代码是汇编写的,你看到了,它只不过把每一位转换成字符,写到输出缓冲区里面,还是看不到补码。

再补充一句,也可以这么理解,你用%o或%x输出,printf把内存中的实际情况显示出来了,你用%d输出,printf自己在中间多了一次转换,让你看得更习惯了。

Printf函数输出格式定义是程序员对输出转换的要求。
机内一个short int 占2 bytes.
用0x%x格式,就是把2 bytes的内容按0xNNNN 输出 (N=0,1,....f)
用0o%o格式,就是把2 bytes的内容按0oNNNNNN 输出(N=0,1,...7)
用%d格式, 就是把2 bytes的内容翻译成十进制符号和十进制数输出。

谈不上是故意输出原码补码问题。而是你看到的结果正好等于原码补码。

看一看C语言中的输入输出函数的用法吧````