那本书里面都有啊啊!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2015-3-17更新~~~~~~~~~~~~~~~~~~~
先上两个解释我的疑惑的链接:
http://en.cppreference.com/w/cpp/language/operator_arithmetic
开始我是看 <<Expert C programming -- Deep C Secrets>>这本书(中文译作 C专家编程), chapter 1 里面的how quite is a quite change 这一小节, 有这样一段代码:
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;
}
然后改成这样
#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.
gcc警告强度开大一点就好了
sh- 4.3# gcc -o main *.c -Wall -Wextra
main.c: In function ' main ':
main.c: 5: 11: warning: comparison between signed and unsigned integer expressions [-Wsign-com
pare]
if(- 1 < (unsigned ) 1)
^
实际上完整的规则还是本文开头的哪两个链接靠谱.
我觉得 best practice应当是尽量少用强制转换, 谁想去记忆那些无聊的规则.