8
votes

wchar_t est non signé ou signé

dans ce lien non signé wchar_t est Typedef éd comme wcharner . Mais je ne trouve pas ce genre de typedef dans mon SDK winnt.h ou mingw winnt.h . .

wchar_t est signé ou non signé?

J'utilise Winapis en langage C.


4 commentaires

Une question similaire: Stackoverflow.com/Questtions/2395514/...


Je pense que cette page est juste incorrecte. La bibliothèque une fois sur un temps utilisé pour utiliser abrégé non signé lorsque le compilateur n'avait pas de type intégré wchar_t . Devinez le non signé vient de partir par erreur lors de la modification de wchar_t .


Signé ou non signé, vous ne devriez pas l'utiliser. Voir utf8everywhere.org


@Pavel: En général, bien sûr, mais lorsque vous devez écrire de code de colle ou des tests de compilateur, ou des décodeurs de chaîne pour un débogueur ou un nombre d'autres cas d'utilisation valide que vous n'avez pas de choix, mais d'utiliser wcharar_t . Les absolus de couverture ont tendance à ne pas être très utiles.


3 Réponses :


14
votes

La signature de wchar_t n'est pas spécifiée. La norme ne dit que (3.9.1 / 5):

type wchar_t doit avoir la même taille, la même signature et les mêmes conditions d'alignement (3.11) comme l'un des autres types intégrés, appelé son type sous-jacent .

(par contraste, les types char16_t et char32_t sont expressément non signés.)


8 commentaires

API Windows semble le définir comme non signé cependant.


@NetCoder: "non spécifié" ne signifie pas que personne n'est autorisé à le définir. Cela signifie simplement que la norme n'impose pas non plus la signature.


Oui, je sais ce que dit la norme, et je sais comment ça marche. La question est étiquetée winapi cependant, donc je pense que ce bit supplémentaire d'informations est toujours utile.


@netcoder ouais son utile cependant. Merci. Regardez le lien dans mon post.


@ user1317084: Votre question sur C ou sur la manière dont Winapi implémente certains aspects définis par la mise en œuvre de C? Ce serait bien si vous pouviez clarifier cela.


Savez-vous si les drapeaux de GCC -Funsigned-Char ou -FSIGNED-CHAR affectent-il? En d'autres termes, n'importe quel moyen de contrôler sa signature?


@Antonio: J'ai bien peur que je ne sache pas, pas plus que la documentation de la GCC ne semble la décrire. Peut-être demander sur les listes de diffusion de la GCC?


@Antonio, ces drapeaux n'affectant que char , je suis sûr que vous ne pouvez pas modifier si wchar_t est signé.



1
votes

Sachez que le type varie de longueur par plate-forme.

Windows utilise UTF-16 et un WCHAR_T est 2 octets. Linux utilise un 4 octet wchar_t.


3 commentaires

Sur la plupart des systèmes Linux que j'ai vu, wchar_t est un type de 32 bits, désignant probablement pour les données UTF-32.


Fixé. Cela fait quelques années que j'ai travaillé avec Unicode - je pensais que je me suis souvenu de Linux avec UTF-8, mais si oui, pourquoi avoir un octet wchar_t?


Les systèmes Linux les plus modernes font UTILISENT UTF-8 Normalement. C'est ce que Char est pour. Un WCHAR_T 32 bits est utile pour UTF-32 où vous souhaitez coder à largeur fixe.



-2
votes

Je viens de tester sur plusieurs plates-formes, sans optimisation.

2) FreeBSD 11.2 (64-bit) + clang 6.0.0:
---- snip ----
#include<stdio.h>
#include<wchar.h>
const wchar_t INVERTED_BOM = 0xFFFE0000;
int main(void)
{
     long long c = INVERTED_BOM;
     printf("0x%016llX\n", c+0x10000000LL);
     return 0;
}
---- snip ----


0 commentaires