网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)

十六进制数相等的推断

请问例如以下程序的输出是神马?

#include <iostream>
#include <string>
using namespace std;

int  main (int, char *[])
{
    char s[1]={0};

    s[0] = 0xfe;
    if (s[0] == 0xfe)
    {
        cout<<"=="<<endl;
    }
    else
    {
        cout<<"!="<<endl;
    }

    return 0;
}

为何不相等呢?

看截图:

详细原因:字面值常量也是有默认类型的,详细例如以下

  1. 整形字面值常量(0xfe。0x124,123,0)的类型是int
  2. 字符字面值常量(‘\0‘,‘0‘,‘a‘)的类型是char
  3. 布尔字面值常量(true,false)的类型是bool
  4. 字符串字面值("abc")的类型是const char*

http://zhidao.baidu.com/question/198400742.html?

qbl=relate_question_1&word=C%2B%2B%20%CA%FD%D6%B5%C4%AC%C8%CF%C0%E0%D0%CD

用字面值常量给变量赋值会出现截断情况,

上面是字面值常量的类型,以下是截断的规则。以下这张图是关键

正确的做法:

(1)用字面值常量赋值的时候保证左操作数的类型能够包容又操作数的值(0x**的一个字节十六进制字面值都能够被char包括。所以能够放心赋值)

(2)用变量和字面值进行逻辑和关系运算时,考虑字面值的默认类型和变量类型是否同样(不同样会发生隐式类型转换)。同样时看看字面值会不会发生(1)的情况

#include <iostream>
#include <string>
using namespace std;

int  main (int, char *[])
{
    char s[1]={0};
    s[0] = (char)0xfe;// s[0] = fe , s[0] < 0
    if (s[0] == (char)0xfe) //禁止类型转换到int
    {
        cout<<"=="<<endl;
    }
    else
    {
        cout<<"!="<<endl;
    }
    return 0;
}

所以,char变量赋值常数的时候要强制转换,推断相等的时候避免转换到int

时间: 2024-11-05 16:25:37

网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)的相关文章

网络编程中的常见陷阱之 0x十六进制数

十六进制数相等的判断 请问如下程序的输出是神马? #include <iostream> #include <string> using namespace std; int main (int, char *[]) { char s[1]={0}; s[0] = 0xfe; if (s[0] == 0xfe) { cout<<"=="<<endl; } else { cout<<"!="<<e

网络编程中常见错误码总结

在网络编程中,总有各种需要注意的环节,几乎每个API都要进行异常处理,判断返回值以及错误码来定位是否需要退出. 本文根据自身使用经验,总结以下错误码及其出现场景和一般处理流程. 网络编程的一般性流程如下 : 客户端 : socket -> connect -> write / read 服务端 : socket -> bind -> listen -> accept 还有因为设置属性带来的其它改变,比如非阻塞和套接字选项. EADDRINUSE : 如果你在同一个端口运行了无

网络编程中的关键问题总结

总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接. accept接受连接的问题在本文最后会聊到,这里谈谈connect的关键点:     使用非阻塞连接建立需要注意:     connect/select返回后,可能没有连接上:需要再次确认是否成功连接: 步骤为: 使用异步connect直接连接一次,因为使用了非阻塞,函数立刻返回: 检查返回值,为0成功连接,否则加入到s

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

网络编程中的read,write函数

关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illustrated,vol1>(TCP/IP详解卷1). 关于第二层面,依然建议Richard Stevens的<Unix network proggramming,vol1>(Unix网络编程卷1),这两本书公认是Unix网络编程的圣经. 至于第三个层面,UNP的书中有所提及,也有著名的C10K问题,业界也有各种各样的框架和解决方案,本人才疏学浅,在这里就不一一敷述. 本文的重点在于第二个层面,主要

网络编程中的超时检测

我们在网络编程中常见的一种做法是:创建好套接字后以阻塞的方式读写,如果没有数据可读的话,程序会一直等待.事实上,网络状况一直不断变化,很有可能在通讯过程中出现网络连接断开.我们在程序中有必要对这种情况进行检测,从而及时做出响应.下面介绍几种常用的超时检测方法(假设我们要求通过套接字等待数据的最大时间为8秒): 一. 设置套接字接收超时 setsockopt可以设置套接字的属性,其中包括接收超时时间.参考代码如下        struct timeval tv; // 描述时间的结构体变量   

Unix网络编程中的五种I/O模型_转

转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描述符.接受数据缓冲地址.大小传递给内核,但是如果此时 该与该套接口相应的缓冲区没有数据,这个时候就recvfrom就会卡(阻塞)在这里,知道数据到来的时候,再把数据拷贝到应用层,也就是传进来的地址空 间,如果没有数据到来,就会使该函数阻塞在那里,这就叫做阻塞I/O模型,如下图: 2. 非阻塞I/O模

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

linux网络编程中INADDR_ANY的使用

网络编程中常用到bind函数,需要绑定IP地址,这时可以设置INADDR_ANY INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”.“任意地址”. 也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思. 比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某 个端口,那他要监听哪个网卡地址的端口呢?如果绑定某个具体的ip地址,你只能监听你所设置的ip地