我读到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/