c语言获取符号位整数和浮点
1. 为什么你应该得到的签位
非常多的时间,我们需要推断的数目值正和负,做了相应的逻辑处理。完成这一要求条件推断语句可以很好。
有时会出现以下情况,
if (x > 0) {
x = x - 1;
} else {
x = 1 - x;
}
if (x < 0) {
x = -x;
}
正负仅仅是数值的符号位变化。或是计算结果的符号位变化。可是我们须要用一个推断,首先条件推断会影响效率,其次格式不够简洁美观。所以,有时候希望能不用条件推断也解决这个问题。而数值的符号位已经被存储在了数值的最高位,能够利用这点来避免条件推断。
2. 怎样得到符号位
可能有非常多种方法。可是通过移位来获得符号位是最直接想到的。
移位有左移右移, 右移由于有符号位的问题。所以。有2个情况,有符号右移和无符号右移。
有符号右移空位补符号位,无符号右移空位补0。当把有符号数,符号位移动到右边第一位的时候。结果-1就是负数。0就是正数。
当把无符号数,符号位移动到右边第一位时候。结果1是负数。0正数。
3. 一种实现方法
由于浮点数无法移位,所以要么强转成整数处理,要么就要拆成数组处理。这里我们使用当做数组处理。
首先,我们把数值不管什么类型当做char[]数组来处理,
(signed char*) &x
这样数值就被切割都多个char类型的空间中,符号位就存储在最高位的char空间中。
((signed char*) &x)[sizeof(x) - 1]
我们假定小端存储模式,那么符号位就在char数组的最后一个空间。我们拿到了有符号位的char数据而且当做有符号数来处理。
((signed char*) &x)[sizeof(x) - 1] >> 7
右移7位表示把符号移动到右边第一位,那么,正数就是0,负数就是-1
最后,完整的宏定义
/**
* Get x sign bit only for little-endian
* if x >= 0 then 1
* if x < 0 then -1
*/
#define MathUtils_SignBit(x) \
(((signed char*) &x)[sizeof(x) - 1] >> 7 | 1)
结果与1或。是把[0, -1]映射到[1, -1], 这样我们就能够把最開始的样例写成这样:
x = (x - 1) * MathUtils_SignBit(x) x *= MathUtils_SignBit(x)
版权声明:本文博客原创文章。博客,未经同意,不得转载。
c语言获取符号位整数和浮点的更多相关文章
- 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)
本文转载自:阮一峰的博客,http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 张玉彬的博客 h ...
- wchar_t是内置还是别名(亲测有效:wchar_t在windows下是16位整数的别名,在linux等平台下是32位整数的别名。MSVC2008开始默认是/Zc:wchar_t)
接前一篇C++ ABI之名字改编(以Qt为例),继续看看C++名字改编相关的问题. 问题 MSVC 有一对选项/Zc:wchar_t- 与 /Zc:wchar_t控制wchar_t 于是 wchar_ ...
- 什么是无符号段整数,什么又是有符号数,(c++与java语言里边的不同)
c++中:整型数分为有符号数和无符号数两种 unsigned int a;无符号整型变量a,意思是这个数最小值为0,最大值为2的32次方-1,因为一个整型数占四个字节,一个字节8位,共32位 int ...
- C语言的有符号与无符号,二进制整数的扩展与截断
C语言的有符号与无符号,二进制整数的扩展与截断 前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看下面C语言的有符号和无 ...
- 小米oj 反向位整数(简单位运算)
反向位整数 序号:#30难度:一般时间限制:1000ms内存限制:10M 描述 输入32位无符号整数,输出它的反向位. 例,输入4626149(以二进制表示为00000000010001101001 ...
- C++ 中注意,零扩展和符号位扩展
版权声明:本文为博主原创文章,未经博主允许不得转载. 首先,介绍一下两种扩展的定义 转 http://blog.csdn.net/jaylong35/article/details/6160736 符 ...
- Java中符号位扩展
第一个例子: byte b=-100;b在内存中是以补码的形式存贮的:1001 1100 如果执行char c=(char)b;如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充( ...
- verilog中符号位的扩展问题
以下内容转自 艾米电子 - 使用有符号数,Verilog(http://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html) Verilog ...
- C++的64位整数
在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...
随机推荐
- VMware vSphere 服务器虚拟化之十六 桌面虚拟化之VMware Horizon View
VMware vSphere服务器虚拟化之十六 桌面虚拟化之VMware Horizon View VMware Horizon View (原VMware View的升级版现在版本5.2)是 ...
- bash组织成树数据结构
君子也非独占,善假于物!bash也因此.昨天晚上,今天早上世界杯很精彩.晚上醒来看到不断地居住的电话.早上没有喝的水开始赞赏在英国和意大利的对决.也TM精彩,最后生下了罗马文化.意大利伊特鲁里亚文化获 ...
- Android更改checkbox的style
resouce文件夹下,value文件夹下,styles.xml文件中新增样式: <resources> <style name="radioButton"> ...
- WPF和Expression Blend开发实例:一个样式实现的数字输入框
原文:WPF和Expression Blend开发实例:一个样式实现的数字输入框 今天来一个比较奇淫技巧的手法,很少人用,同时也不推荐太过频繁的使用. 先上样式: <Style x:Key=&q ...
- wind river hypervisor 2.0.2.1
2692407267@qq.com,请注意很多其他内容http://user.qzone.qq.com/2692407267 wind river hypervisor 2.0.2.1 版权声明:本文 ...
- Best Time to Buy and Sell Stock I,II,III [leetcode]
Best Time to Buy and Sell Stock I 你只能一个操作:维修preMin拍摄前最少发生值 代码例如以下: int maxProfit(vector<int> & ...
- 输出A打头的字符串
题目描述 输出n个字符串,把其中以字母A打头的字符串输出. 输入 第一行 n 第二行到第n+1行,每行一个字符串 输出 A打头的字符串 样例输入 3 Ada Bob Alice 样例输出 Ada Al ...
- 为什么windows dos和Linux shell有这样的差别??
Windows dos随着impdp导入数据库: impdp "sys/password@ip:1521/sidname as sysdba" directory=dbdir du ...
- VS2015 C#6.0
VS2015 C#6.0 中的那些新特性 VS2015在自己机器上确实是装好了,(全部安装的话,在Java SE 开发工具包 会卡顿很长时间,我直接关闭,然后重启电脑,重新修复安装搞定), 想来体验一 ...
- android 处理器crash刊物
日志记录程序是为了方便各种异常情况,为了方便日后的维修方案进行维修,程序无法百分百健康,完美,有必要保存在日志中代码.易于维护.Java了一个接口UncaughtExceptionHandler,Th ...