你什么时候使用“signed char”而不是“unsigned char”?

据我所知,没有太多的之差的unsigned charsigned char ,除了一个符号字符的范围从-127到128和无符号的字符范围从0到255,我想学C ++和我我一直在想这个。 另外,我很久以前就是一个lua程序员,所以我习惯于未签名的字符,所以我只是想知道它们的区别,以及何时使用带符号的字符而不使用unsigned char。

谢谢。


正如@SomeProgrammerDude所解释的,你已经知道,当你希望使用小的整数值时,你明确地指定了signedunsigned 。 在AMD-64体系结构(这是64位通用CPU的最广泛使用的体系结构,可能是笔记本上的一个体系结构)中, signed char占用1个字节,范围从-128到127 , unsigned char也占用1个字节,但范围从0到255。

我想通过展示如何使用带signedunsigned整型(如charshortint ,...)影响最终程序并实际实现,来进一步推动这一点。 我将使用char的例子,但其原理与其他整型类型相同。

假设我们有这个小程序:

// main.cpp

#include <iostream>

int main() {
    signed char   sc = (signed char)255; // equivalent to sc = -1
    unsigned char uc = 255;

    bool signedComp   = (sc <= 5);
    bool unsignedComp = (uc <= 5);

    return 0;
}

如果我们看看汇编器(与您的CPU实际上非常接近的代码),我们可以观察到这种差异。 这是汇编代码中最相关的部分:

movb    $-1, -4(%rbp) # sc = -1
movb    $-1, -3(%rbp) # uc = -1 (equivalent to uc = 255)

cmpb    $5, -4(%rbp)  # compare sc and 5, ...
setle   %al           # ... see whether sc was lower or equal (signed comparison), ...
movb    %al, -2(%rbp) # ... and set the boolean result into signedComp.

cmpb    $5, -3(%rbp)  # compare uc and 5, ...
setbe   %al           # ... see whether uc was below or equal (unsigned comparison), ...
movb    %al, -1(%rbp) # ... and set the boolean result into unsignedComp.

(如果您好奇并想自己生成汇编程序,请运行g++ -S main.cpp -o main.s -O0并查看main.s文件的一部分,您会看到main:标记。)

在你的内存(特别是在堆栈上), scuc都占用1个字节。 实际上, scuc实际上包含相同的值255 。 然而,这是比较的方式,使scuc不同。

因此,这:

unsigned charsigned char之间没有太大的区别

具有讽刺意味的是100%真实。

从中吸取教训是,程序员使用的数字只是概念。 最后,关键是你如何使用1和0。

链接地址: http://www.djcxy.com/p/96705.html

上一篇: When would you use "signed char" over "unsigned char"?

下一篇: C++ char type length and size