int到unsigned int转换

时间:2011-02-12 00:12:06

标签: c++

我很惊讶地知道我无法通过强制转换将signed转换为unsigned int!

int i = -62;
unsigned int j = (unsigned int)i;

我以为自从我开始使用演员表后我就已经知道了,但我不能这样做!

6 个答案:

答案 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)

由于我们知道iint,您可以继续取消它!

这样可以解决问题:

int i = -62;
unsigned int j = unsigned(i);