我正在做这个简单的程序而且我的思绪陷入困境
#include<stdio.h>
int main()
{
signed int a;
signed char c;
unsigned char b;
b = 0xf4;
a = (signed)b; // 1)this assignment should be same
c = (signed)b;
printf("%d\n",a);
a = c; // 2)as this one
printf("%d \n",a);
return 0;
}
a = 244, a = -12
我试图确保分配尽可能顺利,但我得到两个不同的答案,我希望两者都是-12。我错过了什么小事?
相关问题是
{
b = 0xf4;
c = 0xf4;
a = (signed int)b; //trying to save sign but get 244
printf("%d\n", a);
a = c; //sign saved here and got -3
printf("%d", a);
}
244,-3
所以我试图从unsigned char中保存符号。这有可能吗?
答案 0 :(得分:4)
signed char c;
unsigned char b;
b = 0xf4;
/* ... */
c = (signed)b;
b
的值为0xf4
(244
),但c
类型(signed char
)只能保存-128
和{之间的值{1}}(在您的实施中)。因此,当127
分配给244
时,它首先转换为c
,C表示此整数转换是实现定义的。 signed char
和大多数实现一样
只包围模gcc
,这就是为什么256
的值为c
。
以下是-12
文档:
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
“为了转换为宽度为N的类型,该值以2 ^ N的模数减少到”
的范围内
答案 1 :(得分:1)
问题出在这里:
c = (signed)b;
将b,244的值转换为带符号的char会导致整数溢出,从而导致您看到的值为-12。将c的类型更改为signed int
可以解决问题。
答案 2 :(得分:1)
据我了解,244
的输出是正确的。首先,b
被初始化为值244
,表示为十六进制文字,然后转换为signed int a
,其可以保存244
的值。根据{{3}}的规范,244
的输出是预期的。
答案 3 :(得分:0)
如果您没有进行类型转换&#39; b&#39;通过签名,您将获得相同的结果。
在第一次作业中
a =(签名)b;
你正在加载一个带有0xf4的有符号整数(16位/ 32位/ 64位),它可以容纳,并且msb是&#39; 0&#39;结果将是244。
如果您的int长度为8位,那么结果将是&#39; -12&#39;。
在第二种情况下,你必须得到&#39; -12&#39;因为2&#39; -12&#39;的补充是0xf4。