先上两个解释我的疑惑的链接:
http://en.cppreference.com/w/cpp/language/operator_arithmetic
https://msdn.microsoft.com/en-us/library/3t4w2bkb.aspx
开始我是看 <<Expert C programming -- Deep C Secrets>>这本书(中文译作 C专家编程), chapter 1 里面的how quite is a quite change 这一小节, 有这样一段代码:
#include <stdio.h>
int main()
{
if(-1 < (unsigned char)1)
printf("-1 is less than (unsigned char)1: ANSI semantics.\n");
else
printf("-1 is NOT less than (unsigned char)1: K&R semantics.\n");
return 0;
}
我用了vs2013和gcc 4.9.1分别去编译运行, 都是ANSI的语义.打印第一条语句.
然后改成这样
#include <stdio.h>
int main()
{
if(-1 < (unsigned int)1)//或者是unsigned
printf("1111111111.\n");
else
printf("222222222222222.\n");
return 0;
}
gcc 4.9.1编译运行(未加任何特殊编译选项)的结果是打印第二条. 而vs2013默认编译不通过, error:负数转变成了无符号数.
开始看 <<Expert C programming -- Deep C Secrets>>这本书这里时有点偷懒, 只记得了这两句话:
Operands with different types get converted when you do arithmetic. Everything is converted to the type of the floatest, longest operand, signed if possible without losing bits.
实际上完整的规则还是本文开头的哪两个链接靠谱.
我觉得 best practice应当是尽量少用强制转换, 谁想去记忆那些无聊的规则.