你什么时候使用“signed char”而不是“unsigned char”?
据我所知,没有太多的之差的unsigned char
和signed char
,除了一个符号字符的范围从-127到128和无符号的字符范围从0到255,我想学C ++和我我一直在想这个。 另外,我很久以前就是一个lua程序员,所以我习惯于未签名的字符,所以我只是想知道它们的区别,以及何时使用带符号的字符而不使用unsigned char。
谢谢。
正如@SomeProgrammerDude所解释的,你已经知道,当你希望使用小的整数值时,你明确地指定了signed
或unsigned
。 在AMD-64体系结构(这是64位通用CPU的最广泛使用的体系结构,可能是笔记本上的一个体系结构)中, signed char
占用1个字节,范围从-128到127 , unsigned char
也占用1个字节,但范围从0到255。
我想通过展示如何使用带signed
或unsigned
整型(如char
, short
, int
,...)影响最终程序并实际实现,来进一步推动这一点。 我将使用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:
标记。)
在你的内存(特别是在堆栈上), sc
和uc
都占用1个字节。 实际上, sc
和uc
实际上包含相同的值255
。 然而,这是比较的方式,使sc
和uc
不同。
因此,这:
unsigned char
和signed char
之间没有太大的区别
具有讽刺意味的是100%真实。
从中吸取教训是,程序员使用的数字只是概念。 最后,关键是你如何使用1和0。
链接地址: http://www.djcxy.com/p/96705.html