判断有符号和无符号的变量或类型[C/C++]

来源:互联网 发布:下载淘宝app官方软件 编辑:程序博客网 时间:2024/04/23 23:53

判断有符号和无符号的变量或类型[C/C++]

 

        参考别人的代码,自己修改了一下。发现有符号数和无符号数,如果都是正数的话,二进制值是一样,因此不能简单地和0比较。

        有几点值得注意的:

(1)有符号类型和无符号类型一起做运算,有符号类型会自动转成无符号类型;

(2)有符号数最高位是符号位,当有符号数是负数时,转成无符号数,则变成正数,而且一般是很大的正数;

(3)无符号数没有符号位,因此无符号数全部都大于等于0(>=0);

(4)如果一个数是正数,它的有符号和无符号的表示都是一样,只是编译器按照不同的类型解释它。

        具体代码,如下:

#include <iostream>#include <iomanip>using namespace std;#define ISUNSIGNED(a) (((a) | 0x1 << (8 * sizeof(a) - 1)) > 0)#define ISUNSIGNED_TYPE(type) ((type)-1 > 0)int main(){// The values are the same (unsigned vs. signed), // but types are different by contextint i = 1;unsigned int ui = 1;// Set flagscout.setf(ios::showbase | ios::boolalpha);// Examples of using macrocout << ISUNSIGNED(i) << endl;cout << ISUNSIGNED(ui) << endl;cout << ISUNSIGNED_TYPE(signed short) << endl;cout << ISUNSIGNED_TYPE(unsigned short) << endl << endl;// Tell values by typescout << (i | 0x1 << ((8 * sizeof(i)) - 1)) << endl;cout << (ui | 0x1 << ((8 * sizeof(ui)) - 1)) << endl;cout << (unsigned)-1 << endl;cout << -1 << endl << endl;// Tell values ignoring typescout << hex << (i | 0x1 << ((8 * sizeof(i)) - 1)) << endl;cout << hex << (ui | 0x1 << ((8 * sizeof(ui)) - 1)) << endl;cout << hex << (unsigned)-1<< endl;cout << hex << -1 << endl;}

输出结果:

falsetruefalsetrue-214748364721474836494294967295-10x800000010x800000010xffffffff0xffffffff

参考资料:

1、http://zebras.diandian.com/post/2012-10-24/40041214058

原创粉丝点击