user-0 提问: 深夜求救，gcc编译器好像出问题了

回复:
user: user-1
content: 引用 10 楼 lizh1009 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 6 楼 lizh1009 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] 编译器不会出问题 的。只是它是按照它的规则去解析和生成可执行程序。  -1 > 8这个表达式是0(false)；因为-1和8编译器是按照有符号数比较处理的。同理: -1 > (10 - 8); 但是-1 > (*n - 2)就不一样了。由于*n是size_t类型，size_t是无符号数，对于无符号数比较，编译器会现将他们转换成统一类型，一般都是将类型向高转换（也叫隐式提升）；所以，会将-1先转无符号，由于-1是0xffffffff;即将最高位由符号位编程有效数值位，因此得到的是一个很大值。所以-1 > (*n - 2)表达式的值是1(true); 谢谢。还有一点不懂，“将类型向高类型转换”是什么意思？如果是整形和实型比较，整形和字符型比较，他们怎么转换呢？[/quote] 比如unsigned int是int的较高类型，long long也是int的较高类型，就是数值表示的范围更大[/quote] int转double，int转long我都能理解，但是怎么理解您说的“就是数值表示的范围更大”？unsigned int能表示[0~2^32-1]，int能表示[-2^31~2^31-1]，他们能表示的范围都是2^32个数啊。[/quote] https://blog.csdn.net/hanchaoman/article/details/7827031 看一下这个，以这个为准吧

user: user-1
content: 引用 6 楼 lizh1009 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 编译器不会出问题 的。只是它是按照它的规则去解析和生成可执行程序。  -1 > 8这个表达式是0(false)；因为-1和8编译器是按照有符号数比较处理的。同理: -1 > (10 - 8); 但是-1 > (*n - 2)就不一样了。由于*n是size_t类型，size_t是无符号数，对于无符号数比较，编译器会现将他们转换成统一类型，一般都是将类型向高转换（也叫隐式提升）；所以，会将-1先转无符号，由于-1是0xffffffff;即将最高位由符号位编程有效数值位，因此得到的是一个很大值。所以-1 > (*n - 2)表达式的值是1(true); 谢谢。还有一点不懂，“将类型向高类型转换”是什么意思？如果是整形和实型比较，整形和字符型比较，他们怎么转换呢？[/quote] 整型与实数类型的数据比较会向实数类型隐式转换，整型和字符型，字符型是整型的子集，所以字符型转整型

user: user-1
content: 引用 6 楼 lizh1009 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 编译器不会出问题 的。只是它是按照它的规则去解析和生成可执行程序。  -1 > 8这个表达式是0(false)；因为-1和8编译器是按照有符号数比较处理的。同理: -1 > (10 - 8); 但是-1 > (*n - 2)就不一样了。由于*n是size_t类型，size_t是无符号数，对于无符号数比较，编译器会现将他们转换成统一类型，一般都是将类型向高转换（也叫隐式提升）；所以，会将-1先转无符号，由于-1是0xffffffff;即将最高位由符号位编程有效数值位，因此得到的是一个很大值。所以-1 > (*n - 2)表达式的值是1(true); 谢谢。还有一点不懂，“将类型向高类型转换”是什么意思？如果是整形和实型比较，整形和字符型比较，他们怎么转换呢？[/quote] 比如unsigned int是int的较高类型，long long也是int的较高类型，就是数值表示的范围更大

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 6 楼 lizh1009 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] 编译器不会出问题 的。只是它是按照它的规则去解析和生成可执行程序。  -1 > 8这个表达式是0(false)；因为-1和8编译器是按照有符号数比较处理的。同理: -1 > (10 - 8); 但是-1 > (*n - 2)就不一样了。由于*n是size_t类型，size_t是无符号数，对于无符号数比较，编译器会现将他们转换成统一类型，一般都是将类型向高转换（也叫隐式提升）；所以，会将-1先转无符号，由于-1是0xffffffff;即将最高位由符号位编程有效数值位，因此得到的是一个很大值。所以-1 > (*n - 2)表达式的值是1(true); 谢谢。还有一点不懂，“将类型向高类型转换”是什么意思？如果是整形和实型比较，整形和字符型比较，他们怎么转换呢？[/quote] 比如unsigned int是int的较高类型，long long也是int的较高类型，就是数值表示的范围更大[/quote] int转double，int转long我都能理解，但是怎么理解您说的“就是数值表示的范围更大”？unsigned int能表示[0~2^32-1]，int能表示[-2^31~2^31-1]，他们能表示的范围都是2^32个数啊。

user: user-2
content: 你的n是无符号类型，i是有符号类型 ，比较时i会转换成size_t（无符号），对应的并不是负1，而是一个很大的数

user: user-3
content: 一般来说编译器不会出问题 的。

user: user-4
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:编译器不会出问题 的。只是它是按照它的规则去解析和生成可执行程序。  -1 > 8这个表达式是0(false)；因为-1和8编译器是按照有符号数比较处理的。同理: -1 > (10 - 8); 但是-1 > (*n - 2)就不一样了。由于*n是size_t类型，size_t是无符号数，对于无符号数比较，编译器会现将他们转换成统一类型，一般都是将类型向高转换（也叫隐式提升）；所以，会将-1先转无符号，由于-1是0xffffffff;即将最高位由符号位编程有效数值位，因此得到的是一个很大值。所以-1 > (*n - 2)表达式的值是1(true); 谢谢。还有一点不懂，“将类型向高类型转换”是什么意思？如果是整形和实型比较，整形和字符型比较，他们怎么转换呢？

user: user-1
content: 编译器不会出问题 的。只是它是按照它的规则去解析和生成可执行程序。  -1 > 8这个表达式是0(false)；因为-1和8编译器是按照有符号数比较处理的。同理: -1 > (10 - 8); 但是-1 > (*n - 2)就不一样了。由于*n是size_t类型，size_t是无符号数，对于无符号数比较，编译器会现将他们转换成统一类型，一般都是将类型向高转换（也叫隐式提升）；所以，会将-1先转无符号，由于-1是0xffffffff;即将最高位由符号位编程有效数值位，因此得到的是一个很大值。所以-1 > (*n - 2)表达式的值是1(true);

user: user-0
content: 引用 1 楼 paschen 的回复:你的n是无符号类型，i是有符号类型 ，比较时i会转换成size_t（无符号），对应的并不是负1，而是一个很大的数 明白了，谢谢。