签署一个字符是什么意思?

dsi*_*cha 19 c string signed char character-encoding

鉴于有符号和无符号整数使用相同的寄存器等,并且只是不同地解释位模式,而C字符基本上只是8位整数,C中有符号和无符号字符之间的区别是什么?我理解char的签名是实现定义的,我根本无法理解它是如何产生影响的,至少当char用于保存字符串而不是数学时.

Nic*_*cue 23

它不会对字符串产生影响.但是在C语言中你可以使用char来进行数学运算,这会产生影响.

事实上,当在受限制的内存环境中工作时,如嵌入式8位应用程序,通常会使用char来进行数学运算,然后它会产生很大的不同.这是因为byteC中默认没有类型.

  • 他说没有叫做`byte`的类型,不是没有类型是字节. (3认同)
  • 这可以解释为什么还要使用signed char吗?什么时候所有字符都可以用 unsigned char 表示?(我认为负值不会编码为任何内容)。我认为 unsigned char 应该是默认类型,而不是signed char。 (2认同)

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(期望右移)无关.

更新

评论中提到的一些特定于实现的行为:

  • [相比之下,C标准表示有符号整数溢出会导致程序可以执行任何操作的未定义行为](http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Integer-Overflow- Basics.html#Integer-Overflow-Basics)由于历史原因,C标准还允许实现具有补码或带符号幅度的算法 (2认同)
  • @Altes Goral:我喜欢你的答案,但我认为你应该提到char!= signed char.没有"signed"或"unsinged"的类型"char"是实现定义的,这意味着它可以表现为有符号或无符号类型. (2认同)

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)

排序字符串时很重要.

  • “默认情况下,char 是有符号的”正如 OP 所说 - 这是实现定义的。 (2认同)