Newsgroup: it.comp.lang.c++
Titolo: UNSIGNED

Ragazzi quando
dischiaro:
 unsigned char c;
cosa significa?
Grazie mille

VIPER wrote in message

Dovresti chiederlo dove parlano del linguaggio C.
ciao
Stefano C.

Questo e' un po' esagerato. Si tratta di una domanda legittima perche'
il tipo unsigned char esiste in C++ e perche', tra l'altro, le regole di
assegnazione tra variabili signed a non signed sono importanti.
Ti cito da TIC++ :
"
Specifiers modify the meanings of the basic built-in types, and expand
the built-in types to a much larger set. There are four specifiers:
long, short, signed and unsigned.
<skip>
The signed and unsigned specifiers tell the compiler how to use the sign
bit with integral types and characters (floating-point numbers always
contain a sign). An unsigned number does not keep track of the sign and
can store positive numbers twice as large as the positive numbers that
can be stored in a signed number. Signed is the default and is only
necessary with char; char may or may not default to signed. By
specifying signed char, you force the sign bit to be used. 
"
Cioe:
un unsigned char e' una varibile di tipo char che contiene il
doppio della variabile di tipo signed char. Un unsigned char puo' o non
puo' contenere un numero positivo grande il doppio di un char, a secondo
che il tipo ches sia di default signed o unsigned.

 Dovresti chiederlo dove parlano del linguaggio C.
E perché mai? E' anche C++. Io direi, semmai, che VIPER dovrebbe almeno
leggersi le prime pagine di un buon libro sul C++ prima di fare domande
qui.
EMG
PS. Comunque è la dichiarazione di una variabile di tipo carattere senza
segno.

 wrote in message
3A3A0EF6...@cern.ch...


 esempio
Stai cadendo in un equivoco: char NON è un contenitore per caratteri.
char rappresenta un byte, quel byte potrebbe pure essere interpretato come
codice ASCII, ma non è detto.
Es:
    signed char c = -100; /* range da -127 a 127 (circa) */
    unsigned char c = 250; /* range da 0 a 255 */
Saluti
Daniele.

 esempio
Devi tenere presente che il tipo char è comunque un tipo numerico. Fatto
questo, ipotizzando un tipo char lungo un byte, avremo:
signed char sc;     // sc va da -128 a +127
unsigned char uc;     // uc va da 0 a +256
In entrambi i casi, le variabili possono ospitare completamente il range
dei caratteri ASCII stampabili (32-126).
EMG

    signed char c = -100; /* range da -127 a 127 (circa) */
da -128 a +127.
--
Andrea Laforgia (ICQ 87230455)
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

 che il tipo ches sia di default signed o unsigned.
mi sembra che questa sia spiegata coi piedi, senza offesa. Due
variabili di tipo char sia che siano signed, sia che siano unsigned,
hanno esattamente la stessa dimensione. Il fatto è che una può
contenere un valore compreso tra -2^(n-1) e 2^(n-1)-1, mentre l'altra
può contenere un valore compreso tra 0 e 2^n-1, dove n è il numero di
bit di cui è composto un byte nel sistema in questione. Va da se che
assegnamenti come
signed char  a = -1;
unsigned char b = a;
darà dei problemi, comunque segnalati da un compilatore decente.

codice ASCII, ma non è detto.
Per la verita` non e` neanche detto che un char abbia la dimensione di
un byte e` invece vero che sizeof(char)==1 (cioe` la dimensione di
ciascun tipo e` espressa in multipli di quella di char).
Paolo

ciascun tipo e` espressa in multipli di quella di char).
No, la dimensione di un char e' *sempre* 1 byte.
Non e' detto che un char occupi 8 bit perche' non e' detto che un byte
occupi 8 bit. E' la dimensione del byte che varia e quindi anche
quella del char.


 occupi 8 bit.
...ma il byte non era definito come "otto bit" ?!?
Forse ti confondi con la word della macchina, che può essere variabile...
Massimo

Forse ti confondi con la word della macchina, che può essere variabile...
In alcune piattaforme il byte è formato da 7 bit quindi ha ragione il Sig.
Laforgia a considerare tale variante.
Infatti anche il codice ASCII - se ricordo bene - è formato solamente da 7
bit per questioni di compatibilità dovendo essere supportato ovunque.

quella del char.
Ho ricontrollato sullo standard ed in effetti hai ragione, lo standard
afferma che sizeof(char)==1 e che sizeof ritorna il numero di byte.
Quindi un carattere occupa sempre un byte che pero` come tu
giustamente affermi non e definito essere composto da 8 bit.
Il che in un certo qual modo cio` equivale sostanzialmente a dire 
che e` meglio non fare ragionamenti sui byte (tradizionali).
Paolo

Forse ti confondi con la word della macchina, che può essere variabile...
Tranquillo, non mi confondo, il byte, secondo lo standard, e' definito
di *almeno* 8 bit.
Tratto dall'ANSI C Rationale, "1.6  Definitions of terms" :
"The definitions of object, bit, byte, and alignment reflect a strong
consensus, reached after considerable discussion, about the
fundamental nature of the memory organization of a C environment: 
All objects in C must be representable as a contiguous sequence of
bytes, each of which is at least 8 bits wide.  
A char (or signed char or unsigned char)  occupies exactly one byte.  
(Thus, for instance, on a machine with 36-bit words, a byte can be
defined to consist of 9, 12, 18, or 36 bits, these numbers being all
the exact divisors of 36 which are not less than 8.)  These strictures
codify the widespread presumption that any object can be treated as an
array of characters, the size of which is given by the sizeof operator
with that object's type as its operand."


Laforgia a considerare tale variante.
In realta' si discute di byte in quanto formato da *almeno* 8 bit.


> In realta' si discute di byte in quanto formato da *almeno* 8 bit.
Non escludo che tu abbia ragione ma personalmente il byte a 9 bit o più non
l'ho ancora visto.
-- 
La classifica dei prodotti MS:
C#, la migliore barzelletta di Bill Gates.
J++, la copiatura più riuscita.
Windows, il più instabile.
Visual Basic, un esempio di prodotto decente della MS - forse l'unico -.
OutlookExpress, scandali su scandali.

 ha scritto nel messaggio
news:TDx_5.113549$hk4.4...@news.infostrada.it...


di solito è 1 byte (dipende dal compilatore).
E' SEMPRE 1 byte.


l'ho ancora visto.
Questo non vuol dire che non esista.


l'ho ancora visto.
Io per lavoro ho a che fare fra le altre cose con una macchina in
cui il byte e' di 16 bit. La memoria e' organizzata a word da
16 bit che rappresenta l'unita' minima gestita dalla CPU (per
usarne 8 si lavora di and/shift).
Si tratta di un DSP della Texas.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 wrote in message
eGs$VMvZA...@cwnts22.ciaoweb...


 variabile char come può essere un intero..............
In effetti una variabile char non è proprio un intero: quando la si assegna
ad un intero avviene una promozione automatica di tipo. Prova ad esempio ad
assegnare una variabile int ad una char: a meno di un cast, non riuscirai a
compilare il tuo codice.
Domenico Barra

L'Univac 1100/80 aveva byte di 6 bit; ogni word comprendeva 6 byte. Se
non ricordo male i caratteri erano rappresentati su 9 bit.
Il punto e' che lo standard C++ definisce il byte come la dimensione di
un carattere.
Ciao,
Nicola

compilare il tuo codice.
Il tipo char, come gia' detto molte altre volte, e' considerabile a
tutti gli effetti un tipo intero.
Il problema nell'assegnazione da intero a char (che passa la
compilazione in modo indolore) e' dovuta alla perdita di precisione.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia


 darà dei problemi, comunque segnalati da un compilatore decente.
No, e' un assegnamento valido: b avra' come valore la rappresentazione
di a interpretata come intero senza segno. In complemento a due e con
byte di 8 bit si ha:
a = -1 = 11111111 = b = 255
Ciao,
Nicola

 ha scritto nel messaggio
news:kl6q3tgsvn87bp9oi...@4ax.com...

Ho letto su MSDN che nel compilatore C# incluso in Visual Studio 7 (detto
anche Visual Studio .NET) i "char" vengono considerati come caratteri
unicode, quindi 16 bit, mentre gli int vengono portati a 32 bit, e i long
int a
64 bit. Tutto raddoppiato 'nzomma, per supportare i processori a 64 bit.
Come già detto, dipende dal compilatore.
Forse è un po' OT, dato che qui si parla di C, e non di C#, quindi penso che
tu abbia comunque ragione. Grazie della precisazione.

Come già detto, dipende dal compilatore.
No. Non dipende dal compilatore.
I char secondo lo standard del linguaggio occupano sempre e solo 1
byte. Il C supporta anche i wide-chars, per la costruzione di stringhe
UNICODE, che occupano 2 byte.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
