困惑许久,高分悬赏!

来源:百度知道 编辑:UC知道 时间:2024/05/26 22:19:22
c语言编写输出内存地址中内容
在输出每个字节时,会遇到输出的值前面有多个连续'f'或'F'的现象
如(前面为地址,后面为内容)`
0022FF35:59
0022FF34:ffffffa3
0022FF33:ffffffd7
fffffff的出现都是有字母(十六进制a-e)开头的数据

楼主遇到这种情况是因为输出ffffff的这些数其实都是介于128-255之间的数,我估计楼主是用printf("%x")这样的形式输出的,C语言里,这样形式的输出,系统会认为你想输出一个32位整数,于是就把这个8位整数转换成相应的32位整数了.

我有一个笨办法可以解决这种问题,就是声明一个unsigned char型变量,在打印某个地址的内容前,将内容赋给这个变量,然后printf("%x")打印这个变量.或者在printf语句里,把变量用(unsigned char)强制转换一下试试.

是补码~不过建议验证下 -127
如果是ffffff01 就是补码

程序呢?

呵呵楼上不仔细看别人的回答,先来一句:“上面的都不对”,其实已经有人给出答案了。

你肯定是用printf("%x")来打印char类型的数据了!

0022FF34:ffffffa3
0022FF33:ffffffd7

这样的值是负数

内存中表示负数的方法就是取反加一
比如0xffffffa3 取反就是0x0000005d = 92
加一就是93
所以0xffffffa3对应的就是short型的 -93

取反过程
f=11111111 取反为00000000
所以就相当于给a3取反
a=1010 取反后 0101=
3=0011 取反后 1100

0101 1100 = 92

主遇到这种情况是因为输出ffffff的这些数其实都是介于128-255之间的数,我估计楼主是用printf("%x")这样的形式输出的,C语言里,这样形式的输出,系统会认为你想输出一个32位整数,于是就把这个8位整数转换成相应的32位整数了.

我有一个笨办法可以解决这种问题,就是声明一个unsigned char型变量,在打印某个地址的内容前,将内容赋给这个变量,然后printf("%x")打