Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较有符号和无符号字符_C++_C_Unsigned Char - Fatal编程技术网

C++ 比较有符号和无符号字符

C++ 比较有符号和无符号字符,c++,c,unsigned-char,C++,C,Unsigned Char,看起来很奇怪。我发现了误会。我使用带有字符的gcc作为签名字符。我一直认为,在比较表达式(和其他表达式)中,如果需要,有符号值会转换为无符号值 int a = -4; unsigned int b = a; std::cout << (b == a) << std::endl; // writes 1, Ok inta=-4; 无符号整数b=a; STD::CUT< P>按C++标准 6如果两个操作数都是算术或枚举类型,则通常 对两个操作数执行算术转换;每个 如果指定的

看起来很奇怪。我发现了误会。我使用带有字符的gcc作为签名字符。我一直认为,在比较表达式(和其他表达式)中,如果需要,有符号值会转换为无符号值

int a = -4;
unsigned int b = a;
std::cout << (b == a) << std::endl; // writes 1, Ok
inta=-4;
无符号整数b=a;

STD::CUT< P>按C++标准

6如果两个操作数都是算术或枚举类型,则通常 对两个操作数执行算术转换;每个 如果指定的关系为true,则运算符应产生true,并且 如果它是假的,那么它就是假的

所以在这个表达式中

b == a
举例说明

char a = -4;
unsigned char b = -a;
std::cout << (b == a) << std::endl; // writes 0
输出是

a = fffffffc'   'b = 4
b is greater than a, that is b is positive and a is negative
编辑:直到现在我才看到变量的定义必须是

    char a = -4;
    unsigned char b = a;
这是b A定义中的负号。它们都是因为无符号值可以转换为有符号值,而不是相反(如您所说)。

由于
(无符号)int
至少有16位宽,我们将其用于教学目的:

在第一种情况下:
a=0xfffc
,和
b=(unsigned int)(a)=0xfffc

在以下步骤中,比较评估为:

((无符号整数)b==(无符号整数)a)
(0xfffc==0xfffc)
,即
(1)


在第二种情况下:
a=0xfc
,和
b=(无符号字符)((int)a)
或:

b=(无符号字符)(0xfffc)=0xfc
即符号扩展到
(int)
,并被截断

由于和
int
可以表示
signed char
unsigned char
类型的范围,因此比较结果为:(零扩展与符号扩展)

((int)b==(int)a)
(0x00fc==0xfffc)
,即
(0)



注意:在这些情况下,和整数转换规则的行为方式相同。当然,我假设
char
类型是8位的,这是典型的,但只是最低要求。

第一个输出1,你确定吗。第一个和第二个都不输出
1
。是的,第一个输出1,第二个输出0。这两个都是默认升级的结果。@R..,再次强调,。您的意思是
未签名的xxx b=a对于这两种情况?它可以解释这种混乱。不,不(至少在第一个例子中不是这样)。引用不完整。如果比较秩相同且“小于”int的无符号和有符号类型,则有符号操作数将转换为无符号类型。@Jeffrey:Read
[C++11:5/9]
字符
有符号字符
无符号字符
几乎总是由“常用算术转换”。但如果
CHAR\u MAX>INT\u MAX
UCHAR\u MAX>INT\u MAX
,则
CHAR
或分别
unsigned CHAR
将被提升为
unsigned INT
。只有当
CHAR\u BIT>=16
sizeof(INT)时才会发生这种情况=“1 < <代码> >,对于< <代码> char < /> >,如果代码> char 恰好是一个无符号的类型。在8位字节的系统中,您将永远不会遇到这种情况。@ VladfromMoscow:我确信它是允许在C中的;我几乎可以肯定它是在C++中允许的。考虑<代码> CARYBIT=16 < /COD>,“平原<代码> char < /Calp>是未签名的,<代码> CARYMAX=65536</c。ode>,
sizeof(int)==1
int\u MAX==32767
。我很想看看标准中的一个条款,这会违反它。(类似地,
UINT\u MAX>LONG\u MAX
甚至不是特别不寻常;
char
不寻常,因为它可以是有符号的,也可以是无符号的。)顺便说一句,如果你想在注释中通知我,at符号和我的名字之间不能有空格。不,两个操作数都转换为int类型,也就是说转换为signed int类型。@vladfromscow,那么你是说它们都转换为
int
?@vladfromscow,我在这里说什么?”未签名的值可以转换为有符号的值“你的短语会让读者感到困惑。它不清楚,也没有显示机制。@弗拉德:用“我启用了演示代码”来形容你;你能解释一下吗?E是原始帖子中的一个错别字。因此,在第一个示例中,a和b应该具有相同的内部表示0xfffc
a = fffffffc'   'b = 4
b is greater than a, that is b is positive and a is negative
    char a = -4;
    unsigned char b = a;