我正在用C做一些比特转换工作,而我正在读取无符号字符。我使用这些变量的每个函数都需要将unsigned char作为输入,或者因为我将值加载为unsigned会自动保持第一位是否为正?
基本上我需要这样做:
int Test1(unsigned char input1)
{
...
}
对于一切,或将:
int Test2(char input2)
{
...
}
足够?感谢。
答案 0 :(得分:2)
int Test2(char input2)
可能不起作用。 最大unsigned char
大于最大signed char
(范围内的最大正整数)。
但是!
由于unsigned char
和signed char
的大小相同,无论您将其视为signed char
还是unsigned char
,内存中存储的内容都是相同的。访问它们时,只有解释才有所不同。
同样char var
并不意味着它是signed char
。它实际上取决于编译器标志。 Read here
答案 1 :(得分:1)
它不会改变值,但可能会有不同的解释,所以它实际上取决于你想在函数内做什么,例如:
unsigned char c = 255;
void Test1(unsigned char c)
{
printf("%d\n", (c>100)); //prints 1
printf("%d\n", (unsigned char)c); //prints 255
}
void Test2(char c)
{
printf("%d\n", (c>100)); //prints 0
printf("%d\n", (unsigned char)c); //prints 255
}
答案 2 :(得分:0)
最大可能的unsigned char
值大于最大可能的有符号char
值(因为您实际上需要一位信息用于该符号)。
因此,第一个函数中的某些合法unsigned char
值在传递给第二个函数时将无法表示为签名char
。它们是否以某种方式被截断或转为负面是否真的重要?它们显然会在某种程度上受到损坏。
保持您的类型相同,除非您出于某种原因故意强迫它们(例如,检查您的unsigned char
是否可以表示为char
)。当然,可能存在例外情况,即您对内容有特殊了解。