如何删除警告“从’int’转换为’char’可能会改变其值”

我虽然如果我cast出这样的数字(unsigned char)32它就足以修复编译器警告,但它不像我计划的那样。

这里我有以下部分实际解释问题的程序:

 #include  #include  #include  int main(void){ char *ptr = malloc(6); const char *name = "MICHI"; unsigned int i = 0; if(ptr){ strcpy(ptr, name); ptr[strlen(ptr)] = '\0'; }else{ return 1; } while(ptr[i] != '\0'){ if((ptr[i] >= 'A') && (ptr[i] <= 'Z')){ ptr[i] += (unsigned char)32; } i++; } printf("Name = %s\n",ptr); if(ptr){ free(ptr); ptr = NULL; } } 

当我尝试使用编译器警告ON编译它时,我得到这个:

 error: conversion to 'char' from 'int' may alter its value [-Werror=conversion]| 

这意味着以下ptr[i] += (unsigned char)32; 没有提供我的问题的解决方案。

我的问题是,如何放弃这个警告因为我对它没有任何线索。

Ideone没有多大帮助,因为我认为所有警告都被关闭了。

OP正在使用非常挑剔的警告级别

警告:从’int’转换为’char’可能会改变其值[-Wconversion]

  // Both cause the warning ptr[i] += (unsigned char) 32; ptr[i] = tolower(ptr[i]); 

要解决警告,请明确说明

  ptr[i] = (char) (ptr[i] + 32); ptr[i] = (char) tolower(ptr[i]); 

[详细]涉及像char, short, unsigned char, _Bool, ...这样的窄类型的操作将使用通常的整数提升来提升该操作数,如int/unsigned ,如ptr[i] 。 因此,将int/unsigned返回给char会触发警告。 结果的显式转换会使警告静音。

许多编译省略了[-Wconversion] or equivalent选项,因此不会看到警告。

添加到评论中,实际上只有一种方法可以使用强制转换来消除警告:

 ptr[i] = (char)((int)ptr[i] + 32); 

这样,转换处理被委托给赋值运算符,该运算符在标准6.5.16.1p3中定义(由@Olaf指出)。

这一行:

 ptr[i] += (unsigned char)32; 

真正意思:

 ptr[i] = ptr[i] + 32; 

现在…… ptr[i]可能合法地大到255.如果你加了255 + 32,你就得到287。

你如何建议在char值287,最大值为255?
你不能这样做。 这就是错误所在。

如果你想摆脱这个错误,你必须首先明确自己的想法,当加法可能会产生大于char可以容纳的值时,你想要发生什么。

如果您只是尝试将字母AZ转换为它们的小写等价物,只需使用适当的 api: tolower


如果你真的不打算使用tolower ,那试试这个:

 ptr[i] = (unsigned char)(ptr[i] + 32); 

重要的区别在于类型转换是在计算的结果上,而不是在操作的一个操作上。

警告是因为您可能会超出char值的边界。

通常, 避免警告通常不是一个好主意。

使用tolower()以更清洁的方式完成工作。