演员是否会在系统中保持低位字节的一致性?

时间:2012-12-26 03:40:34

标签: c unicode casting endianness

假设我在wchar_t x;

中有一个unicode字符

当然,将x转换为ASCII的明显方法是使用wctob函数

但我想知道,自the first 255 characters of Unicode correspond with ASCII以来,char的演员是否会在各个平台上持续发挥作用?

char c = (char) x ; // cast to char, this works on Windows

问题是,转换为char会保证保持LOW ORDER位,还是可能保留HIGH ORDER位? (我关注这里的小端/大端情况,虽然我意识到它是否适用于我的小端系统,它肯定应该适用于大端系统)。

3 个答案:

答案 0 :(得分:4)

为了简洁起见,我松散地使用了一些术语。为避免太多混淆,强烈建议仔细研究definitions至少以下术语:ASCII,Unicode,UCS,UCS-2,UCS-4,UTF,UTF-8 ,UTF-16,UTF-32,字符,字符集,编码字符集,保留曲目,代码单元

字符'Q'的代码在ASCII和Unicode中都是81。

81只是一个整数,就像任何其他整数一样。 char变量可以存储数字81. wchar_t变量可以存储相同的数字81.在这两种情况下,我们解释 81为“Q”。

当询问从数字中投出数字81时,如何保留数字81没有多大意义。 longshort。如果它适合那么你就完成了。没有字节序或更高位或更低位或任何涉及的内容。

当您转换存储字符或网络字节流的文件时,字节顺序和位和内容开始变得重要,就像存储(二进制表示)任何旧数字的文件一样。

答案 1 :(得分:1)

如果x不适合char,则行为正式为“实现定义”,并允许发出信号。如果x适合char,则会保留该值(无论字节顺序如何)。

  

6.3.1.3有符号和无符号整数

     

(1)当整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则它不会改变。

     

(2)[此处不适用]

     

(3)否则,新类型被签名,其值无法表示;结果是实现定义的,或者引发实现定义的信号。

为了获得最大的便携性,请先执行范围检查,并仅在值介于SCHAR_MINSCHAR_MAX范围内时进行投射。

(其他人已经注意到,我希望重复一遍,ASCII只扩展到127字符。)

答案 2 :(得分:0)

我的印象是系统的字节顺序在这种情况下并不重要。

我找到了一个非常好的explanation here。 我认为这应该有助于减轻你对铸造的恐惧。