dsi*_*cha 19 c string signed char character-encoding
鉴于有符号和无符号整数使用相同的寄存器等,并且只是不同地解释位模式,而C字符基本上只是8位整数,C中有符号和无符号字符之间的区别是什么?我理解char的签名是实现定义的,我根本无法理解它是如何产生影响的,至少当char用于保存字符串而不是数学时.
Nic*_*cue 23
它不会对字符串产生影响.但是在C语言中你可以使用char来进行数学运算,这会产生影响.
事实上,当在受限制的内存环境中工作时,如嵌入式8位应用程序,通常会使用char来进行数学运算,然后它会产生很大的不同.这是因为byteC中默认没有类型.
Ate*_*ral 21
就它们代表的价值而言:
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(期望右移)无关.
更新
评论中提到的一些特定于实现的行为:
Qua*_*noi 10
#include <stdio.h>
int 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
Run Code Online (Sandbox Code Playgroud)
排序字符串时很重要.
| 归档时间: |
|
| 查看次数: |
34445 次 |
| 最近记录: |