将字符转换为整数会产生负数吗?
Converting chars to integers is creating a negative number?
我正在尝试查找字符数组的平均值。我假设我需要在对它们执行数学运算之前将字符转换为整数,所以我这样做然后在最后将它转换回字符。
我看到的问题是任何具有 3 位数字的字符都将转换为负整数值。两位数的值完美打印出来。我可以通过在 for 循环中执行打印语句来看到这一点。请参阅下面的输出:
我的代码如下:
void main() {
int max;
int min;
int median;
int mean;
unsigned char test[SIZE] = { 34, 201, 190, 154, 8, 194, 2, 6,
114, 88, 45, 76, 123, 87, 25, 23,
200, 122, 150, 90, 92, 87, 177, 244,
201, 6, 12, 60, 8, 2, 5, 67,
7, 87, 250, 230, 99, 3, 100, 90};
mean = find_mean(test);
printf("%d", mean);
/* Statistics and Printing Functions Go Here */
}
char find_mean(char * x) {
int value = 0;
int sum = 0;
int mean = 0;
char mean_char;
for (int i = 0; i < SIZE; i++) {
int value = x[i];
printf("%d\n", value);
sum += value;
}
printf("%d", sum);
mean = sum/SIZE;
mean_char = mean;
return mean_char;
}
改变这个:
char find_mean(char * x)
对此:
unsigned char find_mean(unsigned char * x)
因为您的数组是 unsigned char
类型。相同的更改:
char mean_char;
至:
unsigned char mean_char;
现在你的输出是(在将 sum print 更改为 printf("%d\n", sum);
之后):
...
3759
mean = 93
这是正确的,因为 SIZE
是 40,所以 3759/40 = 93。
启用编译器警告以轻松捕获此类问题。例如,在 GCC 中传递了 -Wall -Wextra
标志,我得到:
prog.c:22:20: warning: pointer targets in passing argument 1 of 'find_mean' differ in signedness [-Wpointer-sign]
22 | mean = find_mean(test);
| ^~~~
| |
| unsigned char *
prog.c:7:23: note: expected 'char *' but argument is of type 'unsigned char *'
7 | char find_mean(char * x);
| ~~~~~~~^
我正在尝试查找字符数组的平均值。我假设我需要在对它们执行数学运算之前将字符转换为整数,所以我这样做然后在最后将它转换回字符。
我看到的问题是任何具有 3 位数字的字符都将转换为负整数值。两位数的值完美打印出来。我可以通过在 for 循环中执行打印语句来看到这一点。请参阅下面的输出:
我的代码如下:
void main() {
int max;
int min;
int median;
int mean;
unsigned char test[SIZE] = { 34, 201, 190, 154, 8, 194, 2, 6,
114, 88, 45, 76, 123, 87, 25, 23,
200, 122, 150, 90, 92, 87, 177, 244,
201, 6, 12, 60, 8, 2, 5, 67,
7, 87, 250, 230, 99, 3, 100, 90};
mean = find_mean(test);
printf("%d", mean);
/* Statistics and Printing Functions Go Here */
}
char find_mean(char * x) {
int value = 0;
int sum = 0;
int mean = 0;
char mean_char;
for (int i = 0; i < SIZE; i++) {
int value = x[i];
printf("%d\n", value);
sum += value;
}
printf("%d", sum);
mean = sum/SIZE;
mean_char = mean;
return mean_char;
}
改变这个:
char find_mean(char * x)
对此:
unsigned char find_mean(unsigned char * x)
因为您的数组是 unsigned char
类型。相同的更改:
char mean_char;
至:
unsigned char mean_char;
现在你的输出是(在将 sum print 更改为 printf("%d\n", sum);
之后):
...
3759
mean = 93
这是正确的,因为 SIZE
是 40,所以 3759/40 = 93。
启用编译器警告以轻松捕获此类问题。例如,在 GCC 中传递了 -Wall -Wextra
标志,我得到:
prog.c:22:20: warning: pointer targets in passing argument 1 of 'find_mean' differ in signedness [-Wpointer-sign]
22 | mean = find_mean(test);
| ^~~~
| |
| unsigned char *
prog.c:7:23: note: expected 'char *' but argument is of type 'unsigned char *'
7 | char find_mean(char * x);
| ~~~~~~~^