整形数据存储形式
在计算机内存里,整数以补码形式存储(正数的补码即原码)。
正数如 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)