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语言获取符号位整数和浮点的更多相关文章

  1. 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)

    本文转载自:阮一峰的博客,http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 张玉彬的博客 h ...

  2. 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_ ...

  3. 什么是无符号段整数,什么又是有符号数,(c++与java语言里边的不同)

    c++中:整型数分为有符号数和无符号数两种 unsigned int a;无符号整型变量a,意思是这个数最小值为0,最大值为2的32次方-1,因为一个整型数占四个字节,一个字节8位,共32位 int ...

  4. C语言的有符号与无符号,二进制整数的扩展与截断

    C语言的有符号与无符号,二进制整数的扩展与截断 前一节说了整数的表示方式,,也就是无符号编码与补码编码.这一届说一下二进制整数的扩展与截断,这部分内容与C语言挂钩.so,我们先看下面C语言的有符号和无 ...

  5. 小米oj 反向位整数(简单位运算)

     反向位整数 序号:#30难度:一般时间限制:1000ms内存限制:10M 描述 输入32位无符号整数,输出它的反向位. 例,输入4626149(以二进制表示为00000000010001101001 ...

  6. C++ 中注意,零扩展和符号位扩展

    版权声明:本文为博主原创文章,未经博主允许不得转载. 首先,介绍一下两种扩展的定义 转 http://blog.csdn.net/jaylong35/article/details/6160736 符 ...

  7. Java中符号位扩展

    第一个例子: byte b=-100;b在内存中是以补码的形式存贮的:1001 1100 如果执行char c=(char)b;如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充( ...

  8. verilog中符号位的扩展问题

    以下内容转自 艾米电子 - 使用有符号数,Verilog(http://www.cnblogs.com/yuphone/archive/2010/12/12/1903647.html) Verilog ...

  9. C++的64位整数

    在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31,2^31),即-2147483648~2147483647.而unsig ...

随机推荐

  1. iSwifting如何发送照片社区

    登录iSwifting社区 1,首先点击"帖子": 2,点击"照片": 3.点击"选择文件上传" 4,上传后的照片: 5,点击上传的照片: ...

  2. Binomial Coeffcients 历届山东省省赛题

    Binomial Coeffcients Time Limit: 1000MS Memory limit: 65536K 题目描述   输入   输出   示例输入 3 1 1 10 2 954 72 ...

  3. Linux下常用操作汇总

    查看linux操作系统位数 (1) 终端输入: file /sbin/init 如 显示: /sbin/init: ELF 32-bit LSB executable, Intel 80386, ve ...

  4. 【原创】leetCodeOj ---Construct Binary Tree from Preorder and Inorder Traversal 解题报告

    原题地址: https://oj.leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 题目 ...

  5. ZOJ 3734 LIKE vs CANDLE

    题目意思:(13年长沙站的一道水DP,本人也去了,当时太水笔) 说俩个人竞争选票,每个人可以随机选择支持谁.每个人带有权重不同. 现在已经结束了投票阶段,你一个骇客 支持LIKE  你写了一个软件可以 ...

  6. effective c++ 条款5 c++ 默默实现的函数

    当写一个空类c++ 会为我们自动提供四个函数 1 默认构造函数 2 默认析构函数 3 拷贝构造函数 4 默认赋值运算符

  7. PDE_DATA 定义

    PDE_DATA 定义 Location: /fs/proc/internal.h static inline struct proc_dir_entry *PDE(const struct inod ...

  8. solr与.net课程(七)solr主从复制

    既然solr是解决大量数据全文索引的方案,因为高并发的问题,我们就要考虑solr的负载均衡了,solr提供很easy的主从复制的配置方法,那么以下我们就来配置一下solr的主从复制 如果我们在192. ...

  9. 王立平--怎么查看Unity的版本号

    1.打开Unity,Help->About Unity 2.版本

  10. ECharts SSH+JQueryAjax+Json+JSP在数据库中的数据来填充ECharts在

    1导入包.设定SSH框架. 进口JQuery的JS包.<script src="JS/jquery-1.7.1.js"></script> 导入EChart ...