我一直在阅读“ KnR”撰写的“ The C Programming Language”一书,并且遇到过以下说法: “普通字符已签名或未签名”
注意:请编写示例并说明。谢谢。
{
char myChar = 'A';
signed char mySignChar = 'A';
unsigned char myUnsignChar = 'A';
}
答案 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)
未经修改的普通char
和int
之间的最大区别在于,没有修饰符的int
会总是被签名,但是它是由实现定义的(即已完成)到编译器),如果没有修饰符的char
已签名或未签名:
char x3; // Could be signed, could be unsigned
int y3; // Will always be signed
答案 1 :(得分:2)
有signed char
和unsigned char
。 char
是默认签名还是未签名取决于编译器及其设置。通常是签名的。
答案 2 :(得分:1)
普通char
是拼写为char
且没有signed
或unsigned
前缀的类型。
普通char
,signed char
和unsigned char
是三种不同的整数类型(是的,字符值是(小)整数),即使普通{{ 1}}与其他两个之一相同。哪个定义了实现。这与说char
不同:普通int
总是与int
相同。
这里有一个微妙的要点:例如,如果普通的signed int
是签名的,则它是一个签名的类型,我们说“普通字符在此系统上是签名的”,但它仍然不是与char
相同的类型。
这两行之间的区别
signed char
与这两行之间的区别完全相同:
signed char mySignChar = 'A';
unsigned char myUnsignChar = 'A';
“可打印字符始终为正”语句的含义与所声明的完全相同。在某些系统上,某些纯字符值是负数。在所有系统上,某些带符号的char值为负。在所有系统上,每种字符都有一个完全为零的字符。但是这些都不是可打印的。不幸的是,语句不一定正确(对于基本执行字符集中的所有字符都是正确的,但对于扩展执行字符集而言并非正确。 )。
答案 3 :(得分:0)
C中有几种字符类型?
有一种char
类型。有3种小字符类型:char
,signed char
,unsigned char
。它们在C中统称为字符类型。
char
具有与signed char
或unsigned char
相同的范围/大小/等级/编码,但是是不同的类型。
它们是C中的3种不同类型。普通字符char
将与singed char
或unsigned char
匹配相同的范围/大小/等级/编码。在所有情况下,大小均为1。
2。myPlainChar - 'A'
与mySignChar - 'A'
和myUnsignChar - 'A'
有何不同?
myPlainChar - 'A'
将与其他两个匹配。
通常mySignChar
的值在[-128 ... 127]范围内,而myUnsignChar
的值在[0 ... 255]范围内。因此,减去'A'
(通常为65)将得出不同范围的潜在答案。
便携式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”。