Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

diferença entre signed e unsigned (Jogo da forca)

Gostaria de entender a razão de ter aparecido este alerta em meu código C:\MinGW\bin>gcc forca.c -W -o forca.exe forca.c: In function 'main': forca.c:21:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for(int i = 0; i < strlen(palavrasecreta); i++) {

//código como está atualmente
#include <stdio.h>
#include <string.h>

int main() {

    char palavrasecreta[20];
    sprintf(palavrasecreta, "MELANCIA");

    int acertou = 0;
    int enforcou = 0;

    char chutes[26];
    int tentativas = 0;

    printf("*********************\n");
    printf("*   Jogo de Forca   *\n");
    printf("*********************\n\n");

    do {

        for(int i = 0; i < strlen(palavrasecreta); i++) {
            int achou = 0;            

            for(int j = 0; j < tentativas; j++) {

                if(chutes[j] == palavrasecreta[i]) {
                    achou = 1;
                    break;
                }
            }

            if(achou) {
                printf("%c ", palavrasecreta[i]);
            } else {
                printf("_ ");
            }
        }
        printf("\n");

        char chute;
        scanf(" %c ", &chute);

        chutes[tentativas] = chute;
        tentativas++;


    } while (!acertou && !enforcou); 


}
5 respostas

Fabio, tenta compilar teu programa com essa linha (sem o -W):

gcc forca.c -o forca.exe

Executa o programa.

Vê se dá o mesmo erro.

Sem o -W ele compilou sem gerar nenhuma mensagem de erro.

Na verdade não chega a ser um erro, mas sim um alerta do compilador referente a comparação entre signed e unsigned entre as linhas 21:20, e era isso que eu queria entender sobre signed e unsigned que apareceu neste alerta

solução!

Fabio,

Não há um tipo dedicado char em C. char é um inteiro, como o short ou o int, só que char é o menor inteiro. Assim, ele pode ser signed ou unsigned, como todo inteiro.

A menos que seja especificado em contrário, os tipos inteiros são signed, ou seja, eles podem ser positivos ou negativos, indo de -128 a -1 e de 0 a +127. Já os tipos unsigned vão de 0 a 255.

Como não existe string com tamanho negativo, strlen() deve retornar apenas números maiores que 0, portanto, strlen() deve retornar um unsigned.

Assim, se você forçar a verificação de signed e unsigned, deve obter esse tipo de warning na comparação de um int (variável i do laço for que, como não foi especificada, é signed) e um int resultado de uma função strlen() (que, por não retornar nunca um tamanho negativo, deve ser unsigned).

Era essa a sua dúvida?

Era isso mesmo.

Muito obrigado!

Por nada, Fabio!

Bons estudos!

Abraço.