Problema com resultado final de programa

nicksmart

Power Member
Concordo com o Baderous, pelo menos na parte do C. Comecei a aprender (a sério) C este semestre, e foi com o livro do Kernigham & Ritchie. Um must! Curto e conciso.

Acredito que seja um bom livro ... ja estou com um problema é que segundo o livro a soma do numero maximo que a variavel int pode tomar é 32767 e se somar mais um daria -32768 e manda fazer um programita que la ta como exemplo so que nao tenho o resultado que eles teem no livro :(
eu obtenho 32767 e entao fiz uma alteraçao com modificadores pra ver se conseguia e nada ...

deixo aqui os programas.

programa sugerido pelo livro:
Código:
// programa de extravazamento
#include<stdio.h>

void main(void)
{
     int positivo=32767;
     int negativo=-32768;
    
     printf("%d+1 é %d\n",positivo, positivo+1);
     printf("%d-1 é %d\n",negativo, negativo-1);
     getchar(); // no livro nao diz pra por este mas tenho k por senao nao consigo ver o resultado final :S 
}
codigo que eu pus e mesmo assim sem resultados:
Código:
// programa de extravazamento
#include<stdio.h>

void main(void)
{
     signed short int positivo=32767;
     signed short int negativo=-32768;
    
     printf("%d+1 é %d\n",positivo, positivo+1);
     printf("%d-1 é %d\n",negativo, negativo-1);
     getchar();
}
outro problema é que no resultado final em vez de aparecer é aparece ú :S podem ajudar?
 
Isso tem a ver com o encoding utilizado. Não é erro nenhum. Provavelmente tens de alterar nas opções do teu compilador o encoding para iso-8859-15 ou iso-latin-15 porque deve estar no encoding de inglês/americano e lá não há acentos nas palavras.
 
Nos computadores actuais o int representa um inteiro de 32 bits, ou seja, se for signed vai até 2,147,483,647.

Se calhar quando o livro foi escrito o int ainda representava um inteiro de 16 bits, e aí é que vai apenas até 32,767.
 
Isso tem a ver com o encoding utilizado. Não é erro nenhum. Provavelmente tens de alterar nas opções do teu compilador o encoding para iso-8859-15 ou iso-latin-15 porque deve estar no encoding de inglês/americano e lá não há acentos nas palavras.
pois mas onde vejo isso? tou farto de correr as opçoes todas :S o meu complidor é o dev-C++ 4.9.9.2

Nos computadores actuais o int representa um inteiro de 32 bits, ou seja, se for signed vai até 2,147,483,647.

Se calhar quando o livro foi escrito o int ainda representava um inteiro de 16 bits, e aí é que vai apenas até 32,767.

pois pensei isso e usei o comando short (ou modificador como la se chama) para o forçar a ser 16 bits e mesmo assim nada :S
 
Código:
#include <stdio.h>
int main(void)
{
    short int x = 32768;
    printf("%d\n", x);
    return 0;
}

Isto mostra-me -32768, está certo.
 
Código:
#include <stdio.h>
int main(void)
{
    short int x = 32768;
    printf("%d\n", x);
    return 0;
}
Isto mostra-me -32768, está certo.

pois mas a mim nao dá :S compila o meu codigo e ve como nao dá :S

Código:
// programa de extravazamento
#include<stdio.h>

void main(void)
{
     short int positivo = 32767;
     short int negativo = -32768;
     
     printf("%d + 1 é %d\n",positivo, positivo+1);
     printf("%d - 1 é %d\n",negativo, negativo-1);
     getchar();
}
estou parado por causa disto :S

EDIT: ja resolvi o encoding aqui
 
Última edição:
O que está a acontecer é que ao fazeres positivo+1, o resultado da operação é um int e não um short int.

Código:
// programa de extravazamento
#include<stdio.h>

int main(void)
{
     short int positivo = 32767;
     short int negativo = -32768;
     
     printf("%d + 1 é %d\n",positivo, (short int)(positivo + 1));
     printf("%d - 1 é %d\n",negativo, (short int)(negativo - 1));
     getchar();
}
Assim já funciona como queres.
 
O que está a acontecer é que ao fazeres positivo+1, o resultado da operação é um int e não um short int.

Código:
// programa de extravazamento
#include<stdio.h>

int main(void)
{
     short int positivo = 32767;
     short int negativo = -32768;
     
     printf("%d + 1 é %d\n",positivo, (short int)(positivo + 1));
     printf("%d - 1 é %d\n",negativo, (short int)(negativo - 1));
     getchar();
}
Assim já funciona como queres.

la esta o livro deve ter sido feito na altura dos 16 bit...
e eu so tinha a noçao do short la em cima e nao sabia como alterar dentro dos parentises :) obrigado...
 
O que está a acontecer é que ao fazeres positivo+1, o resultado da operação é um int e não um short int.

Código:
// programa de extravazamento
#include<stdio.h>

int main(void)
{
     short int positivo = 32767;
     short int negativo = -32768;
     
     printf("%d + 1 é %d\n",positivo, (short int)(positivo + 1));
     printf("%d - 1 é %d\n",negativo, (short int)(negativo - 1));
     getchar();
}
Assim já funciona como queres.

A isso se chama overflow. É uma vulnerabilidade de inteiros comum em C. Pode originar buffers overflows. por isso muito cuidadinho :001:
 
A isso se chama overflow. É uma vulnerabilidade de inteiros comum em C. Pode originar buffers overflows. por isso muito cuidadinho :001:

ainda nao tenho conhecimento desses termos... mas penso que seja Informaçao a mais pelo que li causando vulnerabilidades.... mas ate que ponto é isso mau?
 
A vulnerabilidade existe mas pode não ser explorada. Nesse caso, o atacante não consegue explorar pois não é utilizado input do utilizador.
As consequências causadas por buffers overflows são várias: crash do programa, dados corrompidos e, pior que tudo, execução de código arbitrário. Imagina teres um hacker a executar qualquer código na tua máquina...não é muito agradável :)

Mais info.
 
A vulnerabilidade existe mas pode não ser explorada. Nesse caso, o atacante não consegue explorar pois não é utilizado input do utilizador.
As consequências causadas por buffers overflows são várias: crash do programa, dados corrompidos e, pior que tudo, execução de código arbitrário. Imagina teres um hacker a executar qualquer código na tua máquina...não é muito agradável :)

Mais info.

nao é nao ... o meu pc de casa um vez mudou para um wallpaper um bocado estranho que dizia foste invadido ... atualiza o AV :S
 
Back
Topo