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

探讨了在C++中使用十六进制字面值给char类型变量赋值时可能出现的问题,包括类型转换和比较不等的具体原因及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十六进制数相等的判断

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

#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




 

### 十六进制颜色代码表 0x 格式 十六进制颜色代码是一种常见的颜色表示方式,在计算机图形学和网页设计中广泛使用。通常情况下,十六进制颜色代码由一个 `#` 符号后面跟着六个字符组成,这些字符可以是字 `0-9` 或字母 `A-F` 的组合[^1]。然而,当提到以 `0x` 开头的十六进制颜色代码时,则是指一种编程友好的格式,常见于某些编程语言(如 C、Python 等),其中 `0x` 表示后续的内容是一个十六进制值。 以下是部分标准颜色及其对应的 `0x` 格式的十六进制颜色代码: | 颜色名称 | 描述 | 十六进制 (`#`) | 十六进制 (`0x`) | |----------|--------------|-------------------|------------------| | 黑色 | 完全无光 | `#000000` | `0x000000` | | 白色 | 完全反射光线 | `#FFFFFF` | `0xFFFFFF` | | 红色 | 纯红 | `#FF0000` | `0xFF0000` | | 蓝色 | 纯蓝 | `#0000FF` | `0x0000FF` | | 绿色 | 纯绿 | `#00FF00` | `0x00FF00` | | 黄色 | 红加绿混合 | `#FFFF00` | `0xFFFF00` | | 橙色 | 红加黄混合 | `#FFA500` | `0xFFA500` | | 紫色 | 红加蓝混合 | `#800080` | `0x800080` | #### 如何将 `#` 型十六进制颜色转换为 `0x` 型? 可以通过简单的替换操作实现这一目标。例如,在 Python 中可以这样完成: ```python def convert_hex_to_0x(hex_color): if hex_color.startswith("#"): return f"0x{hex_color[1:]}" return None # 测试例子 print(convert_hex_to_0x("#FFFFFF")) # 输出: 0xFFFFFF ``` 如果需要处理透明度(RGBA),则可以在最后附加两位用于 Alpha 渠道[^4]。 --- ### 注意事项 尽管 `0x` 形式的十六进制颜色在一些特定场景下非常有用,但在大多前端开发环境中,更常用的是带有 `#` 的形式。因此,在实际应用中需要注意上下文环境的要求以及兼容性问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值