2010-09-29 61 views
0

其实我(可能)是一个“简单”的问题。所以我不知道如何将有符号整数转换为无符号整数。C:转换签名为无符号

我的代码:

signed int entry = 0; 
printf("Decimal Number : "); 
scanf("%d", &entry); 
unsigned int uEntry= (unsigned int) entry; 
printf("Unsigned : %d\n", uEntry); 

如果我无符号值发送到控制台(见我最后的代码行),我总是得到回一个有符号整数。

你能帮我吗?

非常感谢!

亲切的问候,亲

回答

9
printf("Unsigned : %u\n", uEntry); 
//     ^^ 

必须使用%u符告诉printf运行时,该uEntryunsigned int。如果使用%d,则printf函数将会预计为int,因此会将您的输入重新解释为已签名的值。

+0

嗨肯尼,谢谢你的回答。如果我设置了%u说明符,我将得到-13一个无符号值4294967283.问题是什么。谢谢。 – bitsmuggler 2010-09-29 20:08:45

+0

没有问题。这是变量位的无符号表示。 – 2010-09-29 20:33:19

+2

@pro:当您的格式说明符与要打印的值的类型不匹配时,行为未定义,结果无意义。即当用'%u'打印'-13'时,结果是没有意义的。以及您最初尝试使用'%d'打印无符号值。如果您希望输出有意义,请始终使用正确的格式说明符:'unsigned int'为'%u','signed int'为'%d'。 – AnT 2010-09-30 00:34:29

1

在代码的末尾追加这两行,您就会明白发生了什么。

printf("entry: signed = %d, unsigned = %u, hex = 0x%x\n", entry, entry entry); 
printf("uEntry: signed = %d, unsigned = %u, hex = 0x%x\n", uEntry,uEntry,uEntry); 
+1

虽然它可能会解释您的特定实现如何工作,但这两个调用都会导致未定义的行为。您必须根据您在格式字符串中指定的内容为'printf'提供正确的类型,以便定义好结果。 – 2010-09-30 01:52:16