C中有几种“字符”类型?

时间:2018-08-21 13:10:21

标签: c

我一直在阅读“ KnR”撰写的“ The C Programming Language”一书,并且遇到过以下说法: “普通字符已签名或未签名”

  1. 所以我的问题是,什么是普通字符?与普通字符有何不同? 签名字符和未签名字符?
  2. 在下面的代码中,“ myPlainChar”-“ A”与 'mySignChar'-'A'和'myUnsignChar'-'A'?
  3. 有人可以向我解释一下“ 可打印字符是 总是积极的。”

注意:请编写示例并说明。谢谢。

{
    char myChar = 'A';
    signed char mySignChar = 'A';
    unsigned char myUnsignChar = 'A';
}

5 个答案:

答案 0 :(得分:2)

只有一种char类型,就像只有一种int类型一样。

但是像int一样,您可以添加修饰符以告知编译器是未签名还是已签名的char(或int):

signed char   x1;  // x1 can hold values from -128 to +127 (typically)
unsigned char x2;  // x2 can hold values from 0 to +255 (typically)
signed int    y1;  // y1 can hold values from -2147483648 to +2147483647 (typically)
unsigned int  y2;  // y2 can hold values from 0 to +4294967295 (typically)

未经修改的普通charint之间的最大区别在于,没有修饰符的int总是被签名,但是它是由实现定义的(即已完成)到编译器),如果没有修饰符的char已签名或未签名:

char x3;  // Could be signed, could be unsigned
int  y3;  // Will always be signed

答案 1 :(得分:2)

signed charunsigned charchar是默认签名还是未签名取决于编译器及其设置。通常是签名的。

答案 2 :(得分:1)

普通char是拼写为char且没有signedunsigned前缀的类型。

普通charsigned charunsigned char是三种不同的整数类型(是的,字符值是(小)整数),即使普通{{ 1}}与其他两个之一相同。哪个定义了实现。这与说char不同:普通int总是与int相同。

这里有一个微妙的要点:例如,如果普通的signed int是签名的,则它是一个签名的类型,我们说“普通字符在此系统上是签名的”,但它仍然不是char相同的类型。

这两行之间的区别

signed char

与这两行之间的区别完全相同:

signed char mySignChar = 'A';
unsigned char myUnsignChar = 'A';

“可打印字符始终为正”语句的含义与所声明的完全相同。在某些系统上,某些纯字符值是负数。在所有系统上,某些带符号的char值为负。在所有系统上,每种字符都有一个完全为零的字符。但是这些都不是可打印的。不幸的是,语句不一定正确(对于基本执行字符集中的所有字符都是正确的,但对于扩展执行字符集而言并非正确。 )。

答案 3 :(得分:0)

  

C中有几种字符类型?

有一种char类型。有3种小字符类型:charsigned charunsigned char。它们在C中统称为字符类型

char具有与signed charunsigned char相同的范围/大小/等级/编码,但是是不同的类型。


  1. 什么是普通字符,它与有符号字符和无符号字符有什么区别?

它们是C中的3种不同类型。普通字符char将与singed charunsigned char匹配相同的范围/大小/等级/编码。在所有情况下,大小均为1。


2。myPlainChar - 'A'mySignChar - 'A'myUnsignChar - 'A'有何不同?

myPlainChar - 'A'将与其他两个匹配。
通常mySignChar的值在[-128 ... 127]范围内,而myUnsignChar的值在[0 ... 255]范围内。因此,减去'A'(通常为65)将得出不同范围的潜在答案。


  1. 有人可以向我解释“可打印字符始终为正”的说法。

便携式C源代码字符(基本 执行字符集)是正数,因此打印源代码文件只打印非负值的字符。

使用printf("%c", some_character_type)putc(some_character_type)值打印数据时,在打印前将正数或负数转换为unsigned char。因此,它是与非负值关联的字符。

C有isprint(int c),它“测试任何打印字符,包括空格”。该函数仅对unsigned char范围内的值和负EOF有效。 isprint(EOF)报告为0。因此,只有非负值才能​​通过isprint(int c)测试。

C确实无法在不进行转换为unsigned char的情况下以字符形式显示负值。

答案 4 :(得分:-3)

我认为这意味着char前面没有'unsigned',即

unsigned char a;

相对于

char a; // signed char

因此,除非您使用语句“ unsigned”,否则基本上变量始终是带符号的(用于整数和char)。

那也应该回答第二个问题。

第三个问题:ASCII集中的字符被定义为无符号字符,即数字-60不表示字符,而65则表示“ A”。