2011-02-25 86 views
0

我有一个无符号的字符,我需要在printf之前转换为字符。因此,示例代码是这样的:C/C++铸造的问题,无符号char到字符

unsigned char y = sample.result; 
    char x = (char)y; 
    printf("%c \n", x); 

然而,printf不打印x但如果我使用COUT,x打印correctly.I不知道为什么这样。如何将一个unsigned char变量转换为char?我做错了吗? reinterpret_casting仅用于指针,而我的指针不是。提前致谢。

编辑:命令提示符返回给我一个笑脸“☺”的sample.result的值与unsigned char 1相对应。并且显然netbeans无法打印这个笑脸。我不知道它是如何翻译成笑脸的。任何帮助?编辑2:我只是意识到你不能打印字符x = 1;我只是意识到你不能打印字符x = 1;我只是意识到你不能打印字符x = 1;我只是意识到你不能打印字符x = 2;我只是意识到你不能打印字符x = 1;在netbeans中,并在命令提示符下打印,产生笑脸。原因是什么? :(

+2

你有什么编写和适合我的。你期望得到什么,你会得到什么? – GreenMatt 2011-02-25 04:20:04

+2

也适用于我,无论是否有演员。 'sample.result'中你碰巧有一个高于127的值吗? – 2011-02-25 04:21:53

+0

如果你想使用一个丑陋的演员(丑陋的好方法!:),那么我相信static_cast是你正在寻找的。它可能不会解决你的问题(我相信这个问题必须要做/卡尔的评论),但是这个工作是最接近的。 – 2011-02-25 04:37:38

回答

0

如果char x = 1并且您希望打印出1,则需要在格式说明符中使用%d而不是%c%c打印数字的ASCII representation,对于1是一个称为“标题开始”的不可打印字符。

0

尝试使xint代替char,看看是否能工作。ç规则所需的所有字符参数转换成int,并printf是一个C函数。

+0

“C规则要求将所有char参数转换为int”什么规则? – stefan 2011-02-25 04:50:05

0

我没有信心这个答案,但我只是写了编译和打印字母A,而不铸造无符号的字符回CHAR一个简单的测试程序

#include <stdio.h> 
int main() 
{ 
    unsigned char c = 'A'; 
    printf("%c\n",c); 
    return 0; 
} 

铸造直接还曾:

#include <stdio.h> 
int main() 
{ 
    unsigned char c = 'A'; 
    printf("%c\n",(char)c); 
    return 0; 
} 

做它自己的方式也工作了......

#include <stdio.h> 
int main() 
{ 
    unsigned char c = 'A'; 
    char d = (char)c; 
    printf("%c\n",d); 
    return 0; 
} 

所以我认为我做错了什么,现在。或者也许别的东西是你的问题?

+0

那么最后的代码不会编译,所以你必须有一个神奇的编译器;-) – stefan 2011-02-25 04:50:50

+0

糟糕!忘记%c之前的报价。固定。 – theseankelly 2011-02-25 12:58:08

0

%c转换为printf只适用于基本字符集中的字符。看起来你有一个想要打印的扩展字符,所以你必须使用适当的工具。其类型为wchar_t,打印格式为%lc。但要小心这取决于很多你的执行环境,locale设置和类似的东西。

而且BTW在许多情况下,狭窄的类型,如char只是转换为intunsigned,所以没有必要投它,实际上比你的标题等提出您的问题已经没有太大的做铸造。

0

在这里转换

的方程的算法char c为unsigned char uc

return (c>127) ? (unsigned char)(-(256 + c)) : (unsigned char)c; 

算法的签名ucchar c

return (uc < 0) ? (char)(256-(char)abs(uc)) : (char)uc;