Jump to content

Duvidas - Atribuição de Variáveis


Gonkali
 Share

Recommended Posts

Bom Dia,

Antes de mais peço desculpa pelo que poderá ser uma questão muito simples, mas que eu não estou a conseguir perceber, segue a questão.

Sei que quando declaramos uma variável, estamos a solicitar ao compilador que reserve espaço em memória para armazenar essa variável, sei que o espaço em bytes que lhe é reservado acaba por depender da arquitectura da máquina e sei que quando uma variável é definida lhe fica associado um conjunto de bytes.

O que eu não sei e gostava de perceber é como é que este espaço que fica armazenado em memória pode afectar a portabilidade de um programa em maquinas de 32 e 64 bits.

Um programa para uma máquina de 32 bits tem de ter menos variáveis declaradas?

Peço desculpa se esta questão for descabida, a verdade é que não estou mesmo a perceber como funciona a atribuição das variáveis.

Obrigado

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Link to comment
Share on other sites

A questão é que de arquitectura para arquitectura, o tamanho do tipo de variável que se declara pode variar.

Exemplo:

int num; --> 4 bytes em arquitectura de 32bits

int num; --> 8 bytes em arquitectura de 64bits

O mesmo pode acontecer para double, float, etc etc.

Podes confirmar isto em máquinas com diferentes arquitecturas usando a função sizeof() do C.

printf (Inteiro: %d\n, sizeof(int));

Nota:

Não tneho a certeza se em vez do "d" no printf não se terá que usar outra letra para fazer corresponder ao tipo de valor que o sizeof() devolve que é size_t.

Explicação mais detalhada

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to comment
Share on other sites

Boas Psy,

Antes de mais obrigado pela resposta, o que eu gostava de saber também seria como é que a portabilidade de um determinado programa pode ser afectado de acordo com a atribuição das variáveis e possíveis soluções para optimizar o código para uma maior portabilidade.

Penso que será sempre %d porque a expressão sizeof vai apresentar sempre o nº de bytes em inteiros.

Um abraço

Edited by Gonkali

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Link to comment
Share on other sites

Boas Psy,

Antes de mais obrigado pela resposta, o que eu gostava de saber também seria como é que a portabilidade de um determinado programa pode ser afectado de acordo com a atribuição das variáveis e possíveis soluções para optimizar o código para uma maior portabilidade.

Penso que será sempre %d porque a expressão sizeof vai apresentar sempre o nº de bytes em inteiros.

Um abraço

Em Linux, acho que se usar "%d" para imprimir o retorno de uma função como o sizeof(), vou ter warnings. Terá que ser algo como "%zu" ou algo parecido!

Quanto à portabilidade de código pensado para arquitecturas de 32 ou 64 bits para outros sistemas, há a possibilidade de prever e construir o código de forma "dinâmica" de forma a compactuar com o sistema em que é usado o programa.

Pelo pouco que sei desse aspecto, temos os comandos para o pré-compilador (acho que é assim que se diz) do "ifdef" e/ou "ifndef" que permite deixar o programa/SO definir qual o código a usar de acordo com a arquitectura da máquina em que o programa está a correr!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to comment
Share on other sites

não ha nada melhor que um desenho :

struct {
 long stupid;
 char byte;
} data = { -1, 0 };

agora vamos compilar isto numa máquina de 64bits:

// cada bloco é um byte

+--+--+--+--+ +--+--+--+--+ +--+--+--+--+
|11111......| |.......1111| | 0|XX|XX|XX|
+--+--+--+--+ +--+--+--+--+ +--+--+--+--+

agora vamos compilar isto numa máquina de 32bits:

// cada bloco é um byte

+--+--+--+--+ +--+--+--+--+
|111.....111| | 0|XX|XX|XX|
+--+--+--+--+ +--+--+--+--+

agora pensa nisto : o que aconteceria se eu correr o código de 64bits numa máquina de 32bits :

// +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
// |11111......| |.......1111| | 0|XX|XX|XX|
// +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
//      A          A
//      |          +-----------+
//  data.stupid           data.byte

printf("%ld\n", data.stupid); // output : -1
printf("%d\n", data.natural); // output : -1

agora o inverso:

// +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
// |111.....111| | 0|XX|XX|XX| |XX|XX|XX|XX|
// +--+--+--+--+ +--+--+--+--+ +--+--+--+--+
//      A                        A
//      |                        |
//  data.stupid              data.byte

printf("%ld\n", data.stupid); // output : oh f*** !!!
printf("%d\n", data.natural); // output : oh f*** !!!
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.