关于判断无符号数和有符号数的问题

本文通过示例代码介绍了如何判断C语言中char类型的具体表示方式(有符号或无符号)。利用宏定义实现对char类型及变量的检测,帮助开发者了解其在不同平台上的表现。

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

对于跨平台开发,数据类型的转换很重要,例如char型,有的平台上为有符号的,有的平台上是无符号的。对此,《C++ Primer》明确指出了char类型表示的特殊性,即char类型具体表示的含义是unsigned还是signed由编译器说了算。

下面是一个测试char类型和变量是否是unsigned的例子。参考《C专家编程》。

//////////////////////////////////////////////////////////////////////////
//
// 判断一个类型和变量是否为无符号数.  [sco_filed 2009/06/13]
// 要点:无符号数和有符号数的区别在于最高位的解析不同。无符号数最高位为1则是一个正的大数;有符合数最高位为1则为负数。

#include <stdio.h>

// (1)数值以补码的形式存储在计算机内,无论无符号数还是有符合号数。

// (2)-1的存储形式为100***001,若为有符号数类型,则小于0;若为无符号数类型,则大于0.

// (3)无符号数的最高位为数值,不是符号位,因此不会是负数。

// (4)要考虑类型提升问题。

#define ISUNSIGNED_TYPE(type)     ((type)-1 > 0)  

#define ISUNSIGNED_VAR(a)           (a >= 0 && ~a >= 0)

// 判断变量a的原始类型是否为无符号的,防止类型提升
#define ISUNSIGNED(type,a)  ( (type)a >= (type)0 && (type)~a >= (type)0 )

int main(void)
{
     char b = 7;

     if (ISUNSIGNED_TYPE(char))
     {
          printf("无符号类型!/n");
     }
     else
     {
          printf("有符号类型!/n");  // 输出
     }

     if (ISUNSIGNED_TYPE(b))
     {
          printf("无符号数!/n");     // 输出
     }
     else
     {
          printf("有符号数!/n");
     }

     printf("-----------------/n"); 
     if (ISUNSIGNED(char, b))
     {
          printf("无符号数!/n");
     }
     else
     {
          printf("有符号数!/n");     // 输出
     }


     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值