int main(void)
{
char x1 = 0x81;
char x2 = 0x1;
int a, b;
a = x1+x2;
b = (a>>8) & 0xFF;
printf("a = %d, b = %d",a, b);
return 0;
}
为什么我得到结果a = -126和b = 255?
x1是1000 0001
x2是0000 0001
Sum = 1000 0010,因此它是130.但是,因为" char"的情况,130超过了8位(128)上表示的最大可能值。 在这种情况下我该怎么办?感谢。
答案 0 :(得分:1)
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (error || data == nil) {
// handle the error
} else {
// process the response data
}
}];
x1+x2
1000 0010
时,符号会延长,
因此signed integer
为a
,其中1111 1111 1000 0010
为两种赞美格式。几乎所有计算机都以两种恭维格式存储负数。
因此,126D
被解释为a
。-126
因此b = (1111 1111 1000 0010 >> 8 ) & (0000 0000 1111 1111)
。假设:
您的编译器将整数视为32位。
负数以2的赞美格式表示。
答案 1 :(得分:1)
在C中,默认情况下,char声明为signed char
( - 127到+127)。如果你想增加范围,那么你必须使它unsigned char
(0到+255)
因此,以下代码段将适用于您
int main()
{
unsigned char x1 = 0x81;
unsigned char x2 = 0x1;
int a, b;
a = x1+x2;
b = (a>>8) & 0xFF;
printf("a = %d, b = %d",a, b);
return 0;
}
答案 2 :(得分:0)
尽管使用0x81初始化signed char
变量,但它的值取决于其数据类型。模式0x81
是-127
的表示。
当你添加-127和1时,得到总和-126。 1000 0010
结果将结果类型signed int
的整数提升到期。在此阶段,符号将扩展为新数据类型。 1111 1111 1000 0010
。高位是您在b
中看到的值。