Come è necessario impostare una variabile per il maggior numero possibile in C?

StackOverflow https://stackoverflow.com/questions/2273913

  •  20-09-2019
  •  | 
  •  

Domanda

Come si dovrebbe impostare una variabile uguale all'infinito (o qualsiasi valore più grande numero garantito) in C?

È stato utile?

Soluzione

#include <limits.h>
int x = INT_MAX;

EDIT:. Risposto prima l'interrogante ha chiarito, stavo solo cercando di indovinare che tipo che volevano

Altri suggerimenti

C'è un file chiamato limits.h (almeno su Linux non c'è), che detiene questo tipo di definizione per esempio

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN   (-INT_MAX - 1)
#  define INT_MAX   2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX  4294967295U

Di gran lunga il metodo più semplice per ottenere il valore più grande per un tipo intero senza segno vale a lanciare (-1) per quel tipo. Lo standard (§6.2.5 / 9) richiede che la matematica non firmato effettuata con modulo un numero maggiore di uno rispetto al massimo valore che può essere rappresentato, quindi per qualsiasi tipo T senza segno, l'espressione ((T)-1) sarà necessariamente il valore più grande possibile dal fatto che tipo.

Un altro modo comune di ottenere valore massimo di interi:

Intero senza segno

unsigned int uMax = (unsigned int)~0;

integer firmato

signed int iMax = (unsigned int)~0 >> 1;

Spiegazione

  • ~0 -> impostare tutti i bit a uno
  • >> 1 -> la cancellazione bit di segno, spostando tutti i bit a destra di una posizione
  • (unsigned int) typecasting unsigned int dopo bit inversione invece di utilizzare ~0U, perché C non ha un suffisso per brevi, letterali char (tutto inferiore rispetto int in generale)

Quindi, per il più grande valore char possibile - basta cambiare nella formula typecasting a unsigned char ed ecc.

Bonus - valore minimo di int firmato

semplicemente invertire tutti i bit ancora una volta nel massimo firmato int espressione:

signed int iMin = ~((unsigned int)~0 >> 1);

che imposta prima bit di segno a uno e il bit di riposo - a zero

In base alle vostre osservazioni, si desidera un unsigned int (anche se si dice "numero intero senza segno", così forse si desidera un valore integrale, non necessariamente un unsigned int).

In C, per tipo intero senza segno, il valore -1, quando convertito in quel tipo, è garantito per essere il più grande valore di quel tipo:

size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;

assegnare valori SIZE_MAX, UINT_MAX e ULONG_MAX alle variabili rispettivamente. In generale, si dovrebbe includere limits.h e utilizzare la macro appropriata, ma è bello sapere che la regola di cui sopra. Inoltre, SIZE_MAX non è in C89, così size_t size_max = -1; lavorerà in C89 e C99.

Si noti che il comportamento di overflow è garantito solo per tipi integrali senza segno.

Dal momento che c'è un tag C ++ su questa questione, io suggerisco numeric_limits:

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();

In genere questo viene fatto 1.0/0.0, ma si può ottenere una compilazione di avvertimento su questo. Io non sono a conoscenza di altri modi portatili di farlo in C89, C99, ma ha macro FP_INFINITE in math.h.

EDIT: A quanto pare. Sam in realtà non vogliono l'infinito, ma i limiti di numero intero, che si possono trovare in limits.h come altri hanno detto

Io in genere uso il * macro _MAX si trovano in limits.h INT_MAX per gli interi, ecc Questi sarà sempre impostato correttamente per il tipo di variabile. Anche i tipi di dimensioni in modo esplicito, come Uint32 avranno le voci corrispondenti in questo file di intestazione.

Questo ha il pregio di essere il più grande valore possibile che una variabile di questo tipo può contenere.

Per un intero senza segno, come lei ha chiesto nella sua interrogazione, si userebbe UINT_MAX

Credo che si consiglia di controllare questo link out:

  

http: // www. gnu.org/s/libc/manual/html_node/Infinity-and-NaN.html

L'ho fatto e funziona benissimo su gcc 4.4.1


#include "math.h"

int main(int argc, char**argv)
{ 
    int x = INFINITY; 
    return 0;
}

  1. In primo luogo, includere un file di intestazione denominato come math.h
  2. Ora, equiparare INT_MAX al numero intero il cui valore si desidera impostare il massimo. ESEMPIO: #include<math.h> //the header file which need to be included// int a=INT_MAX; //Suppose "a" be that integer whose value you want largest//
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top