我很惊讶地知道我无法通过强制转换将signed转换为unsigned int!
int i = -62;
unsigned int j = (unsigned int)i;
我以为自从我开始使用演员表后我就已经知道了,但我不能这样做!
答案 0 :(得分:42)
您可以将int
转换为unsigned int
。转换有效且定义明确。
由于该值为负数,因此会向其添加UINT_MAX + 1
,以使该值为有效的无符号数量。 (从技术上讲,添加了2 N ,其中N是用于表示无符号类型的位数。)
在这种情况下,由于平台上的int
宽度为32位,因此从2 32 中减去62,产生4,294,967,234。
答案 1 :(得分:34)
编辑:正如其他答案中所指出的,标准实际上保证“结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)“。因此,即使您的平台没有将签名的整数存储为两个补码,行为也是一样的。
显然你的有符号整数-62存储在你平台上的二进制补码(Wikipedia)中:
62作为以二进制写的32位整数是
0000 0000 0000 0000 0000 0000 0011 1110
要计算二进制补码(用于存储-62),首先将所有位反转
1111 1111 1111 1111 1111 1111 1100 0001
然后添加一个
1111 1111 1111 1111 1111 1111 1100 0010
如果您将此解释为无符号的32位整数(如果您将其转换为计算机将执行此操作),则最终会得到4294967234: - )
答案 2 :(得分:4)
此转换已明确定义,并将生成值UINT_MAX - 61
。在unsigned int
是32位类型(当今最常见的平台)的平台上,这正是其他人报告的价值。但是,其他值也是可能的。
标准中的实际语言是
如果目标类型未签名, 结果值最小 无符号整数与。一致 源整数(模2 ^ n,其中n是 用于表示的位数 无符号类型)。
答案 3 :(得分:1)
有一点数学帮助
; original example for { x< 40 } x :=x+10 { x < 50}
(push)
(declare-const x Int)
(assert (< x 50))
(assert (< (+ x 10) 50 ))
(check-sat)
(get-model)
(pop)
; {0 ≤ x ≤ 15 } if x < 15 then x := x + 1 else x := 0 endif {0 ≤ x ≤ 15 }
(push)
(declare-const x Int)
(assert (and (>= x 0) (< x 15)))
(assert (ite (< x 15) (and (>= (+ x 1) 0) (< (+ x 1) 15)) (and (= x 0) (>= x 0) (< x 15))))
(check-sat)
(get-model)
(pop)
; {x ≤ 10} while x < 10 do x := x + 1 done {¬x < 10 ∧ x ≤ 10}
(push)
(declare-const x Int)
(assert (and (<= x 10) (< x 10)))
(assert (and (not (< (+ x 1) 10)) (<= (+ x 1) 10)))
(check-sat)
(get-model)
(pop)
; the following are in strongest postcondition form, this typically makes more sense to me
(declare-const x_pre Int)
(declare-const x_post Int)
; { x< 40 } x :=x+10 { x < 50}
(push)
(assert (exists ((x_pre Int))
(and (< x_pre 40)
(= x_post (+ x_pre 10))
(< x_post 50 ))))
(check-sat)
(get-model)
(apply qe)
(pop)
; {0 ≤ x ≤ 15 } if x < 15 then x := x + 1 else x := 0 endif {0 ≤ x ≤ 15 }
(push)
(assert (exists ((x_pre Int))
(and
(and (>= x_pre 0) (< x_pre 15))
(ite (< x_pre 15) (= x_post (+ x_pre 1)) (= x_post 0))
(and (>= x_post 0) (< x_post 15)))))
(check-sat)
(get-model)
(apply qe)
(pop)
; {x ≤ 10} while x < 10 do x := x + 1 done {¬x < 10 ∧ x ≤ 10}
(push)
(assert (exists ((x_pre Int))
(and
(and
(<= x_pre 10) (< x_pre 10))
(= x_post (+ x_pre 1))
(and (not (< x_post 10)) (<= x_post 10)))))
(check-sat)
(get-model)
(apply qe)
(pop)
答案 4 :(得分:1)
i = -62。如果要将其转换为无符号表示形式。对于32位整数,它将是4294967234。 一种简单的方法是
num=-62
unsigned int n;
n = num
cout<<n;
4294967234
答案 5 :(得分:-1)
由于我们知道i
是int
,您可以继续取消它!
这样可以解决问题:
int i = -62;
unsigned int j = unsigned(i);