【发布时间】:2013-12-12 15:21:21
【问题描述】:
#include<stdio.h>
#include<conio.h>
main()
{
int i=-5;
unsigned int j=i;
printf("%d",j);
getch();
}
O/p
-----
-5
#include<stdio.h>
#include<conio.h>
main()
{
int i=-5;
unsigned int j=i;
printf("%u",j);
getch();
}
O/p
===
4255644633
这里我没有收到任何编译错误。
当使用标识符 %d 打印时它给出 -5,当使用 %u 打印时它正在打印一些垃圾值。
我想知道的是
1) 为什么编译器在将带负数的整数分配给 unsigned int 时会忽略。
2) 如何将有符号转换为无符号?
【问题讨论】:
-
如果你打开警告,编译器会警告你你将一个有符号分配给一个无符号。编译器只是将数字复制过来。因此,符号位最终成为无符号情况下数字的一部分。因此,如果您将一个负数
n分配给一个无符号数,您将得到一个大数2^32-|n|(如果它是一个 32 位字)或2^64-|n|如果它是一个 64 位字。 -
我感到困惑的是,在二进制补码中,
-5应该是4294967291,而不是4255644633。我在gcc签出,这确实是我得到的价值。我不明白他是如何获得不同的价值的。 -
@user3095972:您发布的第二个代码不可能输出
4255644633。您要么发布了错误的代码,要么发布了错误的输出。
标签: c