将最小值整数转换为无符号长整数

问题描述 投票:2回答:2

我正在尝试将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 long18446744071562067968int 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,第一个值存储在整数变量中,第二个值存储在...

c++ c type-conversion integer unsigned
2个回答
3
投票
您的情况是未定义的行为,因为d * -1

2147483648


0
投票
所以就像剃刀在上一个答案中所说的,我需要对

integer

© www.soinside.com 2019 - 2024. All rights reserved.