当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《签署一个字符是什么意思?》经验,为你挑选了3个好方法。

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



1> Nick Fortesc..:

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

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


他说没有叫做`byte`的类型,不是没有类型是字节.

2> Ates Goral..:

就它们代表的价值而言:

无符号的字符:

跨越值范围 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"是实现定义的,这意味着它可以表现为有符号或无符号类型.

有符号整数溢出会导致程序无法执行任何操作,包括转储核心或超出缓冲区.


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

3> Quassnoi..:
#include 

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

排序字符串时很重要.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有