把十六进制的数据0xFFFFFFFF,强制转换成int 型的应该是多少?这个转换过程具体是怎么进行的!

xiaole921 2008-03-17 06:48:21
把十六进制的数据0xFFFFFFFF,强制转换成int 型的应该是多少?这个转换过程具体是怎么进行的!
...全文
17426 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hello_world_ww 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

结果是 -1

因为int 为带符号类型,带符号类型最高为是符号位,又因为0xFFFFFFFF,也就是四个字节32 bits全是1, 符号位是1,所以这个数是负数。

内存中的数值为补码表示,所以0xFFFFFFFF是一个负数的补码。负数从补码求原码,最高符号位不变,保持 1, 其余各位求反,末尾加1,也就是 0xFFFFFFFF,二进制为:11111111 11111111 1111……
[/Quote]我以前也是一直这样想的,但是我突然发现,在printf时难道不会把补码转回原码输出吗?
will19891114 2010-09-30
  • 打赏
  • 举报
回复
贴错了,汗!
will19891114 2010-09-30
  • 打赏
  • 举报
回复
fseek(fp1,-1L*sizeof(struct book),1)


sizeof(struct book) 是的类型是unsigned int,进行×法时会将long转换为unsigned int,所以出现了警告
-1L作为long在内存中的表示形式是0xFFFFFFFF
转变成unsigned int 时,它的值已经不是-1了,此时它的值是4294967295,所以-1L*sizeof(char)的运算结果是4294967295

cout<<(-1*sizeof(char))<<endl;//将会显示为4294967295,因为是当做unsigned int输出的
cout<<(int)(-1*sizeof(char))<<endl;//将显示为-1

你的程序运行结果不会出错的原因是fseek的第二个参数的类型是long,会将unsigned int 进行转换。
sugrong001 2008-03-18
  • 打赏
  • 举报
回复
结果是 -1

因为int 为带符号类型,带符号类型最高为是符号位,又因为0xFFFFFFFF,也就是四个字节32 bits全是1, 符号位是1,所以这个数是负数。

内存中的数值为补码表示,所以0xFFFFFFFF是一个负数的补码。负数从补码求原码,最高符号位不变,保持 1, 其余各位求反,末尾加1,也就是 0xFFFFFFFF,二进制为:11111111 11111111 11111111 11111111

-> 10000000 00000000 00000000 00000000
-> 10000000 00000000 00000000 00000001

原码首位表示符号位,其余位表示绝对值大小,所以,这个数是 -1
dubiousway 2008-03-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaole921 的回复:]
那这么说#define ALLEN ((int)0xFFFFFFFF)就是#define ALLEN (-1) 拉,为什么不直接写-1而要搞得这么复杂
[/Quote]

呵呵,lz, 你问的问题都没多大关联,你程序作多了,就会渐渐明白的。或者稍微看点汇编基础,也许对你有帮助。


你10楼的问题,比较难说。因为#define ALLEN ((int)0xFFFFFFFF)的目的并不一定就是为了 定义 一个常量负数 -1 ;假如就是要把 ALLEN 定义成常量-1, 当然#define ALLEN (-1)更方便。

但-1 在单字节里,其数值是 0xFF, 双字节是0xFFFF, 4字节里才是0xFFFFFFFF.

何况,#define 的作用是替代,并不一定是仅仅为了定以 -1 这个值
xiaole921 2008-03-17
  • 打赏
  • 举报
回复
那这么说#define ALLEN ((int)0xFFFFFFFF)就是#define ALLEN (-1) 拉,为什么不直接写-1而要搞得这么复杂
dubiousway 2008-03-17
  • 打赏
  • 举报
回复
8楼,虚拟内存或者物理内存是不用你关心的问题,都是操作系统的事情。多任务操作系统下,一般你的进程都是跑在虚拟内存下。

不管是什么内存,和机器用什么码表示 之间没什么关系。不知道你怎么从我的回贴里 又说起了虚礼内存的问题。
xiaole921 2008-03-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dubiousway 的回复:]
结果是 -1

因为int 为带符号类型,带符号类型最高为是符号位,又因为0xFFFFFFFF,也就是四个字节32 bits全是1, 符号位是1,所以这个数是负数。

内存中的数值为补码表示,所以0xFFFFFFFF是一个负数的补码。负数从补码求原码,最高符号位不变,保持 1, 其余各位求反,末尾加1,也就是 0xFFFFFFFF,二进制为:11111111 11111111 11111111 11111111

-> 10000000 00000000 00000000 00000000
-> 10000000 000000…
[/Quote]
你所说的内存是应该是虚礼内存是吧,而不是物理内存!
野男孩 2008-03-17
  • 打赏
  • 举报
回复
0xFFFFFFFF是-1的补码表示。计算机中用补码来计算加减法非常方便。
dubiousway 2008-03-17
  • 打赏
  • 举报
回复
结果是 -1

因为int 为带符号类型,带符号类型最高为是符号位,又因为0xFFFFFFFF,也就是四个字节32 bits全是1, 符号位是1,所以这个数是负数。

内存中的数值为补码表示,所以0xFFFFFFFF是一个负数的补码。负数从补码求原码,最高符号位不变,保持 1, 其余各位求反,末尾加1,也就是 0xFFFFFFFF,二进制为:11111111 11111111 11111111 11111111

-> 10000000 00000000 00000000 00000000
-> 10000000 00000000 00000000 00000001

原码首位表示符号位,其余位表示绝对值大小,所以,这个数是 -1
wenjun1130 2008-03-17
  • 打赏
  • 举报
回复
不用强制转化啊0xFFFFFFFF 可以是int类型啊 以十进制表示的话 为-1
冰矿 2008-03-17
  • 打赏
  • 举报
回复
0xFFFFFFFF本身就是整型常量啊。
然后看,这肯定是负数了呀,因为最高位为符号位,为1。
然后求其原码
0xFFFFFFFF - 1 = 0xFFFFFFFE
求反后为原码0x80000001,即-1。
如果你的编译器定义整型占四个字节,如果两个字节则截取后面的4个F其实效果一样的。
Treazy 2008-03-17
  • 打赏
  • 举报
回复
int a = (int)0xffffffff;

if sizeof(int) = 2
then a is: 0xffff (also is -1(D))

else if sizeof(int) = 4
then a is: 0xffffffff (also is -1(D))
星羽 2008-03-17
  • 打赏
  • 举报
回复


int main()
{
int n1 = 0xFFFFFFFF;
printf("%d\n", n1);
return 0;
}
sss_free 2008-03-17
  • 打赏
  • 举报
回复
你是要换算成10进制表示的数吧?
这个不难吧?

70,037

社区成员

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

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