OVH Cloud OVH Cloud

constante unsigned int

64 réponses
Avatar
Dominique Baldo
Est ce qu'il y a moyen de faire proprement et simplement la chose
suivante (et pas propre):

unsigned int c;
c=('é'+256)&255; // forçage de 'é' en unsigned int voire unsigned char.

10 réponses

1 2 3 4 5
Avatar
cedric
Alexandre BACQUART wrote:
Et d'ailleurs, tu peux très bien faire :

unsigned int c;
c = 'é';

Ca, c'est propre. Tu n'as rien à forcer car les conversions implicites
s'appliquent et il n'y aucune perte. Dans l'autre sens, il y a perte et
il faut caster.


Je suppose que sur ca machine les chars sont signés et que 'é'<0,
et qu'il voudrait un unsigned int < ~0, c'est à dire que la conversion
en unsigned soit faite avant la conversion en int. Dans ton exemple, le
signe va etre étendu à la taille d'un int.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Dominique Baldo wrote:

Est ce qu'il y a moyen de faire proprement et simplement la chose
suivante (et pas propre):

unsigned int c;
c=('é'+256)&255; // forçage de 'é' en unsigned int voire unsigned char.


unsigned int c = 'é';

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Richard Delorme
Alexandre BACQUART wrote:

Et d'ailleurs, tu peux très bien faire :

unsigned int c;
c = 'é';

Ca, c'est propre. Tu n'as rien à forcer car les conversions implicites
s'appliquent et il n'y aucune perte. Dans l'autre sens, il y a perte
et il faut caster.



Je suppose que sur ca machine les chars sont signés et que 'é'<0,


Rappel : en C, 'é' est de type int.

et qu'il voudrait un unsigned int < ~0, c'est à dire que la conversion
en unsigned soit faite avant la conversion en int. Dans ton exemple, le
signe va etre étendu à la taille d'un int.


Quelle conversion en int ?

--
Richard


Avatar
Vincent Lefevre
Dans l'article <BD1007B5.5489%,
Eric Lévénez écrit:

Le 6/07/04 2:46, dans <40e9f5cd$0$23504$, « Alexandre
BACQUART » a écrit :

Vincent Lefevre wrote:

c = (unsigned char) 'é';


Non, pas propre : cast superflu ET déroutant (même si cela marche).


Ça ne marche pas toujours, en particulier avec un système qui utilise
l'UTF-8 comme Mac OS X.


Si ça ne fonctionne pas, cela veut dire que tu ne peux pas manipuler
des caractères accentués comme des char. Il faut utiliser des wchar_t.
Dans ce contexte, de nombreux programmes sont à revoir...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% validated (X)HTML - Acorn / RISC OS / ARM, free software, YP17,
Championnat International des Jeux Mathématiques et Logiques, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA



Avatar
Vincent Lefevre
Dans l'article <40ea49ae$0$29365$,
cedric écrit:

Gabriel Dos Reis wrote:
| En tous cas, pour un entier :
|
| (x + 256) & 255 == x & 255

Faux.


Uniquement en complément à deux, ou si x est positif, non ?


et à condition qu'il n'y ait pas d'overflow sur le x + 256.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% validated (X)HTML - Acorn / RISC OS / ARM, free software, YP17,
Championnat International des Jeux Mathématiques et Logiques, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


Avatar
Dominique Baldo
Vincent Lefevre nous disait
| En tous cas, pour un entier :
|
| (x + 256) & 255 == x & 255

Faux.


Uniquement en complément à deux, ou si x est positif, non ?


et à condition qu'il n'y ait pas d'overflow sur le x + 256.


sachant que mon 'x' était un entier (accordez moi qu'il fasse au moins
15 bits, ne pinaillons pas) il n'y a pas d'overflow

de plus (-100)&255=-100 (si on est en signé), alors que je veux 156.

En fait (honte sur moi), au départ je voulais faire un truc dans le
genre:

unsigned char transpose[256];
transpose['é']='e' // ce qui ne marche évidemment pas, du fait que 'é'
//est un entier négatif

alors que:

transpose[('é'+256)&255]='e'; // fonctionne mais pas propre

je n'étais pas certain que ce qui suit fonctionne:

transpose[(unsigned int)'é']='e';
ou
transpose[(size_t)'é']='e';

et j'aurais préféré un truc plus court genre (tapez pas merci ;o) ):
transpose[u'é']='e'



Avatar
Antoine Leca
En 40e9f32e$0$6079$, Stephane Legras-Decussy va
escriure:
c = (unsigned char) 'é';
on n'a pas le droit de mettre des caractères accentués dans un code

"propre" , non ?


Si. Mais ce n'est plus « strictement conforme ».

Antoine


Avatar
Antoine Leca
En 40ea4ca5$0$14838$, cedric va escriure:
Eric Lévénez wrote:
c = (unsigned char) 'é';



Ça ne marche pas toujours, en particulier avec un système qui utilise
l'UTF-8 comme Mac OS X.


Et dans ce cas il se passe quoi ? 'é' est de type wchar ou un truc
comme ca ?


'é' est TOUJOURS un int. Simplement, dans un cas comme cela, 'é' est défini
par l'implémentation, et sera probablement en dehors de l'intervalle -128 ..
127 (et il y a pas mal de chances pour que ce soit 50089, 43459 ou
3282632704.)


Antoine




Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Dominique Baldo wrote:

et j'aurais préféré un truc plus court genre (tapez pas merci ;o) ):
transpose[u'é']='e'


transpose[(unsigned) 'é'] = 'e'

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Eric Lévénez
Le 6/07/04 9:10, dans <40ea4fee$0$306$,
« Richard Delorme » a écrit :

Rappel : en C, 'é' est de type int.


Rappel : 'é' est illégal, par exemple, sur une architecture utilisant
l'UTF-8.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.

1 2 3 4 5