我有这个unsigned char
sumBinaryFigure 函数,它计算unsigned long long
数字的二进制表示的数字之和。当我从main函数调用此函数时,对于unsigned long long
,它应该返回一个整数(或其他数值数据类型),尽管函数的数据类型是unsigned char
。可能吗?我试过一个函数重载,它没有用。如果听起来很荒谬,那不是我的错。
unsigned char sumBinaryFigure(unsigned long long number)
{
unsigned int S = 0;
while (number)
{
S += number % 2;
number /= 2;
}
return S;
}
答案 0 :(得分:3)
当我从main函数调用此函数时,对于unsigned long long,它应该返回一个整数,尽管该函数的数据类型是unsigned char。有可能吗?
是。这个问题并不荒谬,C类型只是令人困惑。 unsigned char
和int
都代表整数。
您的代码是正确的。
unsigned char
是一个1字节的数据类型。它可用于表示字母,也可用于表示数字。
以下陈述是等效的。
unsigned char ch = 'A';
unsigned char ch = 65;
无论您使用unsigned char
作为字符还是整数,机器都不关心。
char
不一定包含字符。它也代表小数字
sumBinaryFigure
的发布实现返回0-255范围内的数字,没有错。因为long long
几乎肯定小于256位,所以您不必担心unsigned char
不够大。
如果我可以建议对您的程序进行一次更改以减少混淆,请更改此行
unsigned int S = 0;
到此......
unsigned char S = 0;
为了清楚起见,请考虑以下代码。
int main (void) {
char ch_num = 65; // ch_num is the byte 0100 0001
char ch_char = 'A'; // ch_char is the byte 0100 0001
printf ("%d\n", ch_num); // Prints 65
printf ("%d\n", ch_char); // Prints 65
printf ("%c\n", ch_num); // Prints A
printf ("%c\n", ch_char); // Prints A
}
char
是一个字节。除了我们强加于它之外,它是一系列没有任何意义的位。
该字节可以解释为数字或字符,但该决定取决于程序员。 %c
格式说明符说“将其解释为字符。%d
格式说明符说”将其解释为数字。“
是整数还是字符由输出函数决定,而不是数据类型。
答案 1 :(得分:1)
unsigned char
可以转换为int
,而不会缩小我能想到的所有平台。您不需要重载任何内容,只需将函数的结果分配给int
变量:
int popcnt = sumBinaryFigure(1023);
事实上,考虑到函数语义,结果值无法适应int
,保证至少为16位,这意味着最小{{ {1}}值为32767.您必须拥有能够存储超过32767个二进制数字的数据类型才能实现远程可能(大多数平台上的numeric_limits<int>::max()
为32位)