鉴于有符号和无符号整数使用相同的寄存器等,并且只是不同地解释位模式,而C字符基本上只是8位整数,C中有符号和无符号字符之间的区别是什么?我理解char的签名是实现定义的,我根本无法理解它是如何产生影响的,至少当char用于保存字符串而不是数学时.
它不会对字符串产生影响.但是在C语言中你可以使用char来进行数学运算,这会产生影响.
事实上,当在受限制的内存环境中工作时,如嵌入式8位应用程序,通常会使用char来进行数学运算,然后它会产生很大的不同.这是因为byte
C中默认没有类型.
就它们代表的价值而言:
跨越值范围 0..255 (00000000..11111111)
值在低边缘溢出:
0 - 1 = 255 (00000000 - 00000001 = 11111111)
值在高边缘溢出:
255 + 1 = 0 (11111111 + 00000001 = 00000000)
按位右移运算符(>>
)执行逻辑移位:
10000000 >> 1 = 01000000 (128 / 2 = 64)
跨越值范围 -128..127 (10000000..01111111)
值在低边缘溢出:
-128 - 1 = 127 (10000000 - 00000001 = 01111111)
值在高边缘溢出:
127 + 1 = -128 (01111111 + 00000001 = 10000000)
按位右移运算符(>>
)执行算术移位:
10000000 >> 1 = 11000000 (-128 / 2 = -64)
我包含了二进制表示,以表明值包装行为是纯粹的,一致的二进制算术,并且与正在签名/未签名的char(期望右移)无关.
更新
评论中提到的一些特定于实现的行为:
char!= signed char.没有"signed"或"unsinged"的类型"char"是实现定义的,这意味着它可以表现为有符号或无符号类型.
有符号整数溢出会导致程序无法执行任何操作,包括转储核心或超出缓冲区.
#includeint main(int argc, char** argv) { char a = 'A'; char b = 0xFF; signed char sa = 'A'; signed char sb = 0xFF; unsigned char ua = 'A'; unsigned char ub = 0xFF; printf("a > b: %s\n", a > b ? "true" : "false"); printf("sa > sb: %s\n", sa > sb ? "true" : "false"); printf("ua > ub: %s\n", ua > ub ? "true" : "false"); return 0; } [root]# ./a.out a > b: true sa > sb: true ua > ub: false
排序字符串时很重要.