判断无符号整型和有符号整型
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)
相关文章推荐
- 判断一个整型值有无符号
- 判断页面文本框中输入的类型(数字,符号,字母,汉字)!!(2)
- 关于整型数组如何判断其有效元素
- 有符号整型加法与乘法
- linux c/c++ 判断是否为中文(不包括中文符号,非正则)
- 20170827_判断给定整型正数字是不是回文数字串
- C 语言格式输出 %hd,%hu分别是 短整型 和 无符号的短整型。
- 如何判断一个数为无符号数还是有符号数
- 有符号整型和无符号整型的计算
- shell常用符号和逻辑判断
- 无符号整型与有符号整型
- 关于整型数据符号位扩展的问题
- Linux shell 逻辑判断符号
- 浅析无符号整型和有符号整型
- 判断某个整型是否定义在枚举中
- c 判断变量是有符号数还是无符号数-判断标识符是有符号还是无符号
- 判断一个数字是不是有符号数字,以及一个类型是不是有符号类型
- C语言位操作--判断整数的符号
- 如何判断一个数为无符号数还是有符号数
- linux shell 判断文件是否存在等符号