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

Mic*_*chi 1 c casting

我虽然说,如果我cast有一个像这样的数字(unsigned char)32,就足以解决编译器的警告,但这并不是我的计划。

在这里,我有程序的以下部分,实际上解释了这个问题:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在打开编译器警告的情况下对其进行编译时,得到以下信息:

error: conversion to ‘char’ from ‘int’ may alter its value [-Werror=conversion]|
Run Code Online (Sandbox Code Playgroud)

这意味着以下内容ptr[i] += (unsigned char)32;无法解决我的问题。

我的问题是,如何删除此警告,因为我对此一无所知。

Ideone没有太大帮助,因为我认为所有警告都已关闭。

chu*_*ica 5

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

警告:从“ int”转换为“ char”可能会更改其值[-Wconversion]

  // Both cause the warning
  ptr[i] += (unsigned char) 32;
  ptr[i] = tolower(ptr[i]);
Run Code Online (Sandbox Code Playgroud)

要解决该警告,请明确

  ptr[i] = (char) (ptr[i] + 32);
  ptr[i] = (char) tolower(ptr[i]);
Run Code Online (Sandbox Code Playgroud)

[详细信息]涉及窄类型like的char, short, unsigned char, _Bool, ...运算将使用通常的整数提升int/unsignedlike 来提升该操作数ptr[i]。因此,将其分配int/unsignedchar触发器将触发警告。明确显示结果将使警告消失。

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