user-0 提问: 为什么是unsigned int？

回复:
user: user-1
content: 引用 13 楼 zjq9931 的回复:16进制的写法，就是无符号类型的数。 不是这样的，我说的规则来自C规范。 详情请参考我的博客（常整型部分） http://www.cnblogs.com/edward-bian/p/3870679.html

user: user-2
content: 引用 13 楼 zjq9931 的回复:16进制的写法，就是无符号类型的数。 觉得这个说法合理

user: user-3
content: 16进制的写法，就是无符号类型的数。

user: user-4
content: Integer Promotion:凡是可以使用int或unsigned int类型作右值的地方也都可以使用有符号或无符号的char型、short型及Bit-field。如果原始类型类型范围能用int型表示，则其类型被提升为int，如果int表示不了则提升为unsigned int.

user: user-5
content: 理解和讨论之前请先学会如何观察！

user: user-5
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-6
content: 根据C的标准，在32位环境下0x80000000当然是unsigned int啊  3.1.3.2 Integer constants  Syntax            integer-constant:                   decimal-constant integer-suffix<opt>                   octal-constant integer-suffix<opt>                   hexadecimal-constant integer-suffix<opt>            decimal-constant:                   nonzero-digit                   decimal-constant digit            octal-constant:                   0                    octal-constant octal-digit            hexadecimal-constant:                   0x  hexadecimal-digit                   0X  hexadecimal-digit                   hexadecimal-constant hexadecimal-digit            nonzero-digit: one of                   1  2  3  4  5  6  7  8  9            octal-digit: one of                   0  1  2  3  4  5  6  7            hexadecimal-digit: one of                   0  1  2  3  4  5  6  7  8  9                   a  b  c  d  e  f                   A  B  C  D  E  F            integer-suffix:                   unsigned-suffix long-suffix<opt>                   long-suffix unsigned-suffix<opt>            unsigned-suffix: one of                   u  U            long-suffix: one of                   l  L  Description     An integer constant begins with a digit, but has no period or exponent part.  It may have a prefix that specifies its base and a suffix that specifies its type.     A decimal constant begins with a nonzero digit and consists of a sequence of decimal digits.  An octal constant consists of the prefix 0 optionally followed by a sequence of the digits 0 through 7 only.  A hexadecimal constant consists of the prefix 0x or 0X followed by a sequence of the decimal digits and the letters a (or A ) through f (or F) with values 10 through 15 respectively.  Semantics     The value of a decimal constant is computed base 10; that of an octal constant, base 8; that of a hexadecimal constant, base 16.  The lexically first digit is the most significant.     The type of an integer constant is the first of the corresponding list in which its value can be represented.  Unsuffixed decimal: int, long int, unsigned long int; unsuffixed octal or hexadecimal: int, unsigned int, long int, unsigned long int; suffixed by the letter u or U: unsigned int, unsigned long int; suffixed by the letter l or L: long int, unsigned long int; suffixed by both the letters u or U and l or L: unsigned long int .  32为环境下0x80000000是不能用int表示的，但是可以用unsigned int表示，所以就是unsigned int类型呀

user: user-7
content: 引用 楼主 u013491662 的回复: #include <stdio.h> int main() { 	printf("%d", 0x80000000 >> 31); 	return 0; }  为什么0x80000000是unsigned int类型？它不应该是最小的int数吗？ 要是0x8000就是int型？  电脑没有说它是unsigned int类型，它就是一个二进制数字，你怎么看得出电脑说它是什么类型了？  你其实是想问你的移位计算结果吧。

user: user-8
content: #define is_unsigned(a) ( (a) >= 0 && ~(a) >= 0 ) int main() { 	printf("%d",is_unsigned(0x80000000)); }

user: user-1
content: 写错了 2. 如果从signed开始尝试且为10进制，则跳过unsigned。

user: user-1
content: 常整型的类型定义规则： 1. 从signed int 或指定类型（比如UL）向上尝试； 2. 如果从signed开始尝试且为10进制，则通过unsigned。  0x80000000从signed int 开始尝试，放不下且是16进制，则尝试unsigned int，成功。

user: user-9
content: int最大表示2 147 483 647，0x80000000是十进制的2 147 483 648，已超出范围，在右移之前，要用更大的范围的整数类型表示0x80000000，这是我的理解，不对了欢迎指出来

user: user-6
content: 引用 8 楼 user-10 的回复:他本来就是int型啊 32为环境下0x80000000是unsigned int  程序为证明  #include <stdio.h>  int main(int argc, char *argv[]) {     int n = 0x80000000;     unsigned int u = 0x80000000;      printf("0x%08x 0x%08x 0x%08x\n", n >> 8, u >> 8, 0x80000000 >> 8);      return 0; } /* 输出: 0xff800000 0x00800000 0x00800000 */  虽然C89上说负数的右移操作结果implementation-defined的, gcc对负数的右移是带符号的右移, 这个结果足以说明 0x80000000是unsigned int     The result of E1 >> E2 is E1 right-shifted E2 bit positions.  If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 divided by the quantity, 2 raised to the power E2 .  If E1 has a signed type and a negative value, the resulting value is implementation-defined.

user: user-6
content: 引用 7 楼 misskissC 的回复:Integer Promotion:凡是可以使用int或unsigned int类型作右值的地方也都可以使用有符号或无符号的char型、short型及Bit-field。如果原始类型类型范围能用int型表示，则其类型被提升为int，如果int表示不了则提升为unsigned int. 这个和integer promotions提升没有关系吧，

user: user-10
content: 他本来就是int型啊