您的位置:首页 > 其它

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

2018-03-21 15:14 85 查看

整形数据存储形式

在计算机内存里,整数以补码形式存储(正数的补码即原码)。正数如 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: