我正在尝试将integers的最小值转换为unsigned long,如下所示:
-2147483648 to 2147483648
第一个值存储在integer变量中,第二个是我试图使我的[[unsigned long变量采用的值。
integers
-2147483648
的最小值转换为unsigned int,如下面的主要内容所示:int main()
{
int d = -2147483648;
unsigned int u = (d * -1);
printf("%u\n", u); //the output is "2147483648"
}
但是当我尝试执行相同的转换为时,我的输出将成为设备中的最大unsigned long值unsigned long
18446744071562067968
int main()
{
int d = -2147483648;
unsigned long ul = (d * -1);
printf("%lu\n", ul); //the output is "18446744071562067968"
}
我搜索了一些有关数据类型及其范围的信息,发现的范围是unsigned long
0 to 18446744073709551615
,我计算出当我们将integers的最小值与-1
相乘时,它不会改变,因为integers的最大值为2147483647
,所以它保持为-2147483648
,当我将其提供给不包含该值的unsigned long时,它将成为其自身范围18446744073709551615
的最大值。所以我试图将-2147483648 * -1
的值存储在long int
变量中,该变量的范围是[-9223372036854775808 to 9223372036854775807
,因此它可以存储值2147483648
。int main()
{
int d = -2147483648;
long int l = d; // l now contains -2147483648
l *= -1; // now it becomes 2147483648
unsigned long ul = l; // now we managed to store 2147483648 in unsigned long variable
printf("%ld\n", ul) //the output is "2147483648"
}
这里我的问题解决了,但是这次我想像下面这样进行转换:
int main()
{
int d = -2147483648;
unsigned long ul = (long)(d * -1);
printf("%lu\n", ul) //the output is "18446744071562067968" :(
}
但是当我尝试以另一种方式unsigned long ul = -(long)(d);
投射它时,会出现所需的输出2147483648
。
所以我的问题是,第一次浇铸和第二次浇铸方法之间有什么区别,为什么它仅适用于第二种方法?
我正在尝试将整数的最小值转换为无符号长整数,如下所示:-2147483648至2147483648,第一个值存储在整数变量中,第二个值存储在...
d * -1
为2147483648
integer