我读到C并没有定义char是带符号的还是无符号的,在GCC页面中这说它可以在x86上签名,而在PowerPPC和ARM中可以无符号。

Okey,我正在用GLIB编写一个将char定义为gchar的程序(仅此而已,这只是一种标准化方法)。

我的问题是,UTF-8呢?它使用超过一个内存块吗?

说我有一个变量



看,如果我声明我的变量为



我将只有127个值(所以我的程序将存储更多的内存块)还是UTF-8也更改为负值?

抱歉,如果我无法正确解释,但我认为我有点复杂。

笔记:
谢谢大家的回答

我不明白它是如何正常解释的。

我认为就像ascii一样,如果我的程序上有带符号的和无符号的char,则字符串具有不同的值,这会导致混淆,请在utf8中想象一下。

最佳答案

我有几个要求来解释我的评论。

当您比较字符并期望某种顺序时,char类型可以默认为有符号或无符号类型这一事实可能很重要。特别是,UTF8使用高位(假设char是8位类型,在绝大多数平台上都是如此)来表示字符代码点需要表示一个以上的字节。

一个简单而又肮脏的问题示例:

#include <stdio.h>
int main( void)
{
    signed char flag = 0xf0;
    unsigned char uflag = 0xf0;

    if (flag < (signed char) 'z') {
        printf( "flag is smaller than 'z'\n");
    }
    else {
        printf( "flag is larger than 'z'\n");
    }


    if (uflag < (unsigned char) 'z') {
        printf( "uflag is smaller than 'z'\n");
    }
    else {
        printf( "uflag is larger than 'z'\n");
    }
    return 0;
}

在我从事的大多数项目中,通常使用显式指定char的typedef来避免使用未经修饰的unsigned char类型,这对我们有利。类似于uint8_t中的stdint.h
typedef unsigned char u8;

通常,处理unsigned char类型似乎工作良好且几乎没有问题-我偶尔看到的一个问题是使用该类型的东西来控制循环时:
while (uchar_var-- >= 0) {
    // infinite loop...
}

关于有关编码有符号/无符号的字符C问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2524226/

10-11 22:57
查看更多