C/C++知识点分享(13)

作者: 307656af5a04 | 来源:发表于2019-07-09 05:21 被阅读4次

    1.下面的代码输出是什么,为什么?

    void foo(void)
    {
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
    }

    解析:这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。

    2.TCP/IP 建立连接的过程?

    答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
      
    第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状 态,等待服务器确认;

    第二次握手:服务器收到syn包必须确认客户的SYN(ack=j+1)同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    3.求下面函数的返回值

    int func(x)
    {
    int countx = 0;
    while(x)
    {
    countx ++;
    x = x&(x-1);
    }
    return countx;
    }

    假定x = 9999。 答案:8
    解析:将x转化为2进制,看含有的1的个数。
    知道了这是统计9999的二进制数值中有多少个1的函数,且有9999=9×1024+512+256+15

    9×1024中含有1的个数为2;
    512中含有1的个数为1;
    256中含有1的个数为1;
    15中含有1的个数为4;
    故共有1的个数为8,结果为8。
    1000 - 1 = 0111,正好是原数取反。这就是原理。
    用这种方法来求1的个数是很效率很高的。
    不必去一个一个地移位。循环次数最少。

    4. 下面程序的结果是多少?

    P1=(unsigned char *)0x801000;
    p2=(unsigned long *)0x810000;
    请问p1+5= ;
    p2+5= ;
    解析:0x801005(相当于加上5位)
    0x810014(相当于加上20位);

    相关文章

      网友评论

        本文标题:C/C++知识点分享(13)

        本文链接:https://www.haomeiwen.com/subject/lktnhctx.html