我有这段代码:
#include <stdio.h>
#include <iostream>
int main(int n, char** args)
{
int i = 140;
char c = i;
int j = c;
printf("%d", j);
system("pause");
}
输出:
-116
据我了解,char c = i
会将具有ASCII代码140的字符分配给c
,但我想知道在此之后分配int j = c;
时发生了什么,-116
在哪里价值来自哪里?
如果我将char c = i;
更改为unsigned char c = i;
,则输出为140
。
如果我在这里不使用j
,是否仍然可以使140
的值等于unsigned
? (假设i> = 0且i <= 255)
答案 0 :(得分:1)
range of values for an unsigned char包含<site name="MyWebSite" id="1234">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\inetpub" />
</application>
<application path="/subsite1" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Solution\subsite1" />
</application>
<application path="/subsite2" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Solution\subsite2" />
</application>
<application path="/subsite3" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Solution\subsite3" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1234:localhost" />
</bindings>
</site>
- 但签名字符的值范围为[0,255]
。
[-128,127]
的值超出了签名字符的范围,因此溢出并回绕到140
。至少那似乎正在发生的事情 - 有符号整数的溢出是undefined behaviour。
如果不使用-116
或unsigned char
的更大替代品,我们没有任何办法可以避免这种情况 - 您只是想表示一个无法实现的价值由该类型代表。