【编程基础】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)

转自(http://www.th7.cn/Program/c/201503/412753.shtml)

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【C语言系列】C语言概念--基本数据类型简介

1.概述   C 语言包含的数据类型如下图所示: ? 2.各种数据类型介绍 2.1整型   整形包括短整型、整形和长整形。 2.1.1短整形   short ...

3938
来自专栏轮子工厂

8. 一花一世界,while for 循环?

wo这周有点懒啊,这才第 2 篇,个人有点事情,本来预计可以更新……1 篇的,︿( ̄︶ ̄)︿

902
来自专栏落影的专栏

程序员进阶之算法练习(二十)

前言 这四个题属于中等,有的需要一定的代码量,有的需要奇妙的思考。 正文 1. Sonya and Queries 题目链接 ** 题目大意:** 给出一...

3294
来自专栏编程

您真的会用switch吗?

C语言的理念,程序员应该知道自己正在干什么,而且保证自己的所作所为是正确的。 switch知多少 各个case和default的顺序可以是任意的,但习惯上总是d...

1977
来自专栏angularejs学习篇

js中对arry数组的各种操作小结

  最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以...

1042
来自专栏java一日一条

Java 泛型详解

泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用。本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类...

835
来自专栏恰同学骚年

你必须知道的指针基础-3.指针的移动及指针的危险

  指针每次加一就是指针向前移动指针类型对应的字节数。下面通过一个int指针来指向一个int数组,看看指针的加法运算到底是个什么鬼?

812
来自专栏PHP在线

5个值得深思的 PHP 面试问题

文章所罗列的问题虽然看似简单,但是每个背后都涵盖了一个或几个大家容易忽视的基础知识点,希望能够帮助到你的面试和平时工作。 Q1 ? 正确运行的输出结果: "y...

2984
来自专栏向治洪

迭代器模式

迭代器模式(Iterator): 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 用途:在软件构建过程中,集合对象内部结构常常变化各异。...

18510
来自专栏北京马哥教育

深入 Python 字典的内部实现

字典是通过键(key)索引的,因此,字典也可视作彼此关联的两个数组。下面我们尝试向字典中添加3个键/值(key/value)对: 这些值可通过如下方法访问: 由...

35315

扫码关注云+社区