判断无符号整型和有符号整型

整形数据存储形式

在计算机内存里,整数以补码形式存储(正数的补码即原码)。

正数如 50000 :

原码为:0000 0000 0000 0000 1100 0011 0101 0000

补码为:0000 0000 0000 0000 1100 0011 0101 0000

负数如-100 :

原码为 : 1000 0000 0000 0000 0000 0000 1100 0100

补码为 : 1111 1111 1111 1111 1111 1111 0011 1100

可用如下代码以二进制输出各位验证。
 #include<bitset>
    int i = 50000;
    bitset<32>bs(i);
    cout<<bs;  

无符号整数转为有符号整数

    参考菜鸟教程的示例
#include <iostream>
    using namespace std;
    int main()
    {
    short int i;           // 有符号短整数
    short unsigned int j;  // 无符号短整数
    j = 50000;
    i = j;
    cout << i << " " << j;
    return 0;
    }

无符号短整型变量j = 50000存储为

1100 0011 0101 0000 (无符号)

将j赋给有符号短整型变量i,即i的值在内存中的存储形式为

1100 0011 0101 0000 (有符号)

对一个数的补码求补码即本身。

1100 0011 0101 0000 的补码为 1011 1100 1011 0000

即-15536

判断整型变量有无符号


给定一个数,如何区分有符号还是无符号呢?

首先无法用函数实现目的。函数形式参数的类型是在函数内部定义的,所以它无法穿越调用这一关。

因此,必须编写一个宏,根据参数的声明对它进行处理。接下来就是区别宏的参数到底是一个类型还是一个类型的值。

假定参数是一个值,无符号数的本质特征是它永远不会是负的,有符号数的本质特征是对最左边一个位取补将会改变它的符号。

(比如2的补码表示,它肯定是个负数)。

由于作为参数的这个值的其它位与这个测试无关,你可以对它们全部取补,结果是一样的。

因此,可以像下面这样尝试:

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

如果宏的参数是一个类型,其中一个方法是使用类型转换:


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值