int 型如何转换成unsigned int

yilin54 2009-04-14 12:18:33
int a=-2;
printf("%u",a);

这个打印出来的值是4294967295。请问大家这个是怎么换算的啊?


还有
unsigned int a = 6;
int b = -2;
(a+b > 6) ? puts("M") : puts("N");
这里为什么不输出M.而是输出N啊? 如果令b=-10,那就可以输出M。这是奇怪。因为在运算过程中(a+b),b不论是-2还是-10,算出的结果都应该是大于6的啊。
...全文
2152 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
niu05500230 2009-09-25
  • 打赏
  • 举报
回复
学习了,这似乎是一道企业面试题
morris88 2009-04-14
  • 打赏
  • 举报
回复 1

int a=-2;
printf("%u",a);

假定 32 位 cpu,那么 -2 在内存及寄存器表示为 0xfffffffe,因为 printf 中的 "%u" 要求采用 (unsigned int) 方式打印,所以将 -2 转换为 unsigned int 型,就是 0xfffffffe,那打印出来的就是 4294967294...


unsigned int a = 6;
int b = -2;
(a+b > 6) ? puts("M") : puts("N");


因为 + 的优先级大于 >,先执行 a + b,因为类型不同,所以会进行算术转换,按照 c 语言编译器规则,将 b 转换为 unsigned int,所以相加后结果会发生溢出:
(a + b) = 0x00000006 + 0xfffffffe = 0x00000004;

再执行 > 运算符,整数文字常量,其缺省类型为 int,所以在比较时也会发生类型转换,转换为 unsigned int,所以:
4 > 6 ? puts("M") : puts("N")
此时条件为 false,故执行 puts("N"),打印出 N...
黄志义 2009-04-14
  • 打赏
  • 举报
回复
int a=-2;
printf("%u",a);

这个打印出来的值是4294967295。请问大家这个是怎么换算的啊?
-2(0xFFFFFFFE)(二进制11111111111111111111111111111110)转换成了无符号数 最高位符号位为1 当成有效位了 就是4294967294 最后一位应该不是5
allisc 2009-04-14
  • 打赏
  • 举报
回复
一个unsigned int 和 一个int相加,首先把int转化为unsigned,再相加,结果可能溢出,结果丢弃溢出部分
所以
a=6,b=-2时a+b=6+4294967294=4,溢出了
a=6,b=-10时a+b=6+4294967286=4294967292
  • 打赏
  • 举报
回复
unsigned int a = 6;
int b = -2;
(a+b > 6) ? puts("M") : puts("N");


编译器能算出4啊,所以<6.输出N啊。
jackyjkchen 2009-04-14
  • 打赏
  • 举报
回复
溢出了吧,用__int64试试
yilin54 2009-04-14
  • 打赏
  • 举报
回复
你真细心,真牛

[Quote=引用 5 楼 morris88 的回复:]
C/C++ code
int a=-2;
printf("%u",a);



假定 32 位 cpu,那么 -2 在内存及寄存器表示为 0xfffffffe,因为 printf 中的 "%u" 要求采用 (unsigned int) 方式打印,所以将 -2 转换为 unsigned int 型,就是 0xfffffffe,那打印出来的就是 4294967294...


C/C++ code
unsigned int a = 6;
int b = -2;
(a+b > 6) ? puts("M") : puts("N");




因为 + 的优先级大于 >,先执行 a + b,因为类型不同…
[/Quote]
morris88 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 morris88 的回复:]
C/C++ code
int a=-2;
printf("%u",a);



假定 32 位 cpu,那么 -2 在内存及寄存器表示为 0xfffffffe,因为 printf 中的 "%u" 要求采用 (unsigned int) 方式打印,所以将 -2 转换为 unsigned int 型,就是 0xfffffffe,那打印出来的就是 4294967294...


C/C++ code
unsigned int a = 6;
int b = -2;
(a+b > 6) ? puts("M") : puts("N");




因为 + 的优先级大于 >,先执行 a + b,因为类型不同…
[/Quote]

同理,b = -10 时:
(a + b) > 6 => (0x00000006 + 0xfffffff6) > 6 => 0xfffffffc > 6 => true;
所以打印出 M...
liliangbao 2009-04-14
  • 打赏
  • 举报
回复
学习~

69,371

社区成员

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

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