2012-08-18 59 views
0

的C++入门的说:在类型文字,无符号负数

我们可以独立指定signedees和整体 文字的大小。如果后缀包含U,则文字具有无符号的 类型,因此具有U后缀的十进制,八进制或十六进制文字具有最小类型的无符号整数 ,无符号长整型或无符号长整型 ,其中文字的值符合

当一个声明

int i = -12U;

方式我明白它是-12转化成unsigned版本的本身(4294967284),然后分配给int,由于翻滚而产生非常大的正数。

这似乎没有发生。请问我错过了什么?

cout << i << endl; // -12

回答

2

您分配unsigned int的回符号整数,所以它被再次转换。

这就像你这样做:

int i = (int)(unsigned int)(-12); 
+0

没错。所以-12U变成4294967284,那么应该把4294967284分配给一个int。这不是它发生的情况吗? – JAM 2012-08-18 16:46:07

+0

4294967284太大而无法放入int,因此它回绕到负值。 – 2012-08-18 16:46:47

+0

哦,我明白了,有道理。谢谢Vaughn! – JAM 2012-08-18 16:47:23

1

u有效地结合比-更加紧密。你得到-(12u)

+0

那么,如果它不影响字面量(在这个例子中恰好是负值),那么'U'的意义是什么? – JAM 2012-08-18 16:45:03

+1

Upvoted! @Jam摘自[这里](http://en.cppreference.com/w/cpp/language/integer_literal):没有负整数文字。诸如“-1”的表达式将一元减运算符应用于文字表示的值,这可能涉及隐式类型转换。 – legends2k 2015-08-19 06:36:29

1

12具有int类型和值12。

12U的类型是unsigned int和值12。

-12U具有unsigned int类型和值std::numeric_limits<unsigned int>::max() + 1 - 12.

int i = -12U;应用实现定义的转换将-12U转换为int类型。

+0

换句话说,'2^n - literal'其中n是文字类型的位宽。因此,在32位“int”的机器上,“-12U”是2^32 - 12 = 4294967284。 – legends2k 2015-08-19 06:58:12

相关问题