如何编写代码判断变量的类型是否为有符号类型
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
相关产品推荐
相关产品推荐

