You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写代码判断变量的类型是否为有符号类型

C 语言实现

带GNU扩展的极简版本

利用typeof关键字获取变量类型,编译期完成判断,不依赖变量实际值:

#define IS_SIGNED(x)  ((typeof(x))-1 < 0)

原理:将字面量-1强转为目标类型后比较是否小于0。有符号类型转换后值为-1,结果为真;无符号类型转换后为该类型的最大正值,结果为假。

C11标准兼容版本

用_Generic做类型匹配,无编译器扩展依赖:

#define IS_SIGNED(x) _Generic((x), \
    char: (char)-1 < 0, \
    signed char: 1, \
    unsigned char: 0, \
    short: 1, \
    unsigned short: 0, \
    int: 1, \
    unsigned int: 0, \
    long: 1, \
    unsigned long: 0, \
    long long: 1, \
    unsigned long long: 0, \
    float: 1, \
    double: 1, \
    long double: 1 \
)

C++ 实现

C++11及以上版本直接使用标准库的类型萃取工具,编译期计算,无需自定义宏:

#include <type_traits>

// 假设要判断的变量名为target
constexpr bool is_target_signed = std::is_signed_v<decltype(target)>;

C++03版本可以自行实现类型萃取类,逻辑和C语言版本一致。

注意事项

  • 所有实现均在编译期完成判断,不会读取变量的实际存储值,完全匹配只判断类型属性的需求
  • 浮点类型默认都是有符号类型,上述实现均已覆盖
  • char类型本身的符号属性由编译器和平台决定,两种实现都可以正确识别当前环境的char属性

内容的提问来源于stack exchange,提问作者ADBeveridge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:04