码迷,mamicode.com
首页 > 其他好文 > 详细

关于 C 的 arithmetic conversion (进行 算术运算 时的 强制转换规则)

时间:2015-03-17 20:02:50      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

先上两个解释我的疑惑的链接:

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应当是尽量少用强制转换,  谁想去记忆那些无聊的规则. 

关于 C 的 arithmetic conversion (进行 算术运算 时的 强制转换规则)

标签:

原文地址:http://www.cnblogs.com/likeatree/p/4345159.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!