如果声明一个变量是无符号的,那么与它相关的函数也必须同样吗?

时间:2012-11-19 15:12:30

标签: c unsigned bit-shift

我正在用C做一些比特转换工作,而我正在读取无符号字符。我使用这些变量的每个函数都需要将unsigned char作为输入,或者因为我将值加载为unsigned会自动保持第一位是否为正?

基本上我需要这样做:

int Test1(unsigned char input1)
{
...
}

对于一切,或将:

int Test2(char input2)
{
...
}

足够?感谢。

3 个答案:

答案 0 :(得分:2)

int Test2(char input2)可能不起作用。 最大unsigned char大于最大signed char (范围内的最大正整数)。

但是!

由于unsigned charsigned 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)。当然,可能存在例外情况,即您对内容有特殊了解。