- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
int v;
int sign; // the sign of v ;
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
Q1: 既然 v 是由 int
类型定义的,那么为什么还要再把它转换成 int
呢?跟便携有关系吗?
编辑:
Q2:
sign = v >> (sizeof(int) * CHAR_BIT - 1);
这个片段不是可移植的,因为signed int
的右移位是实现定义的,如何填充左边距位由编译器决定。所以
-(int)((unsigned int)((int)v)
做一些便携的把戏。请解释一下为什么会这样。unsigned int
的右移 不是总是在左边距位中填充0 吗?
最佳答案
它不是严格可移植的,因为理论上 int
是可能的和/或 unsigned int
有填充位。
在假设的实现中 unsigned int
有填充位,右移 sizeof(int)*CHAR_BIT - 1
从那以后会产生未定义的行为
sizeof(int)*CHAR_BIT - 1 >= WIDTH
但是对于所有 unsigned int
的实现没有填充位——据我所知,这意味着所有现有的实现——代码
int v;
int sign; // the sign of v ;
sign = -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));
必须设置sign
至 -1
如果v < 0
如果 v >= 0
则为 0 . (注意 - 感谢 Sander De Dycker 指出 - 如果 int
有一个负零,那也会产生 sign = 0
,因为 -0 == 0
。如果实现支持负零并且负零的符号应该是 -1
,这种转移和比较 v < 0
都不会产生这样的结果,因此需要直接检查对象表示。)
投向int
投到unsigned int
之前在转变之前完全是多余的,什么也不做。
它是 - 忽略假设的填充位问题 - 可移植,因为标准规定了到无符号整数类型的转换和无符号整数类型的表示。
转换为无符号整数类型是缩减模 2^WIDTH
, 其中WIDTH
是类型中值位数,因此结果位于 0 到 2^WIDTH - 1
的范围内包容性。
因为 unsigned int
中没有填充位int
范围的大小不能大于 unsigned int
, 以及带符号整数的标准要求 (6.2.6.2) 表示为
最小的可能表示 int
值为 -2^(WIDTH-1)
.所以负int
值(value) -k
转换为 2^WIDTH - k >= 2^(WIDTH-1)
因此设置了最高有效位。
非负 int
另一方面,值不能大于 2^(WIDTH-1) - 1
因此它的值将通过转换保留,并且不会设置最高有效位。
所以当转换的结果移动WIDTH - 1
时右边的位(同样,我们假设 unsigned int
中没有填充位,因此 WIDTH == sizeof(int)*CHAR_BIT
),如果 int
将产生 0值是非负的,一个 1
如果它是负的。
关于c - 为什么这个 bit-hack 代码是可移植的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855825/
我希望在我的页面上使用一些吸引眼球的实验性 CSS,例如 border-radius(圆 Angular )和渐变。不幸的是,Internet Explorer 还不支持任何这些。至少 border-
我不喜欢微软的字体渲染。 我为客户创建了一个站点,我的调试列表中最后一个未选中的框是最大的。 (顺便说一句,它还没有“上线”,所以请忽略任何其他错误 - http://baked-beans.tv/b
一般情况下,当我们想在同一页面显示某个网页的内容时,我们会使用ajax请求。如果说,我使用 AJAX 请求不同域中的网页,由于跨端脚本错误,这是不允许的。但是为什么允许通过服务器端页面访问。例如我们可
在我的 css 代码中,我有一些 hack,我想影响 IE6/7 #topmenu li a.activa, #topmenu li a.activa:hover{ *background:
在过去的两个月里,我一直在试图“愚弄”safari,让它认为它正在查看服务器上的一个文件,这实际上是来自摄像机的实时视频流,根据请求使用 Gstreamer 编码和混合成一种格式这是浏览器支持的。由于
怎么说呢,相信很多考过竞赛的同学都会在平时的练习/考试中遭遇过100分但没有AC的情况,结果一看评测结果:subtask的数据点没过! 这时候就是遇到hack数据了,如果被这类数据卡住,说明你
Avast 不时出现在我的一个网站上。有点奇怪,因为我对安全性非常严格,但我检查了 index.php 文件和所有相关的包含和脚本。在我删除的“header.php”文件中发现了一些奇怪的 PHP 代
所以我使用一个程序,我在 lua 中编写 mods,lua 处于沙箱状态,这意味着大多数功能都被阻止,如 IO 和 OS,我什至不能使用 REQUIRE 添加库。我需要一个功能来解压缩我的一个 mod
在 Wiki page for Sudoku solutions ,一种解决方案声称使用“Dot Hack”。链接的 Github 页面不再可用,我在别处找不到任何关于它的信息。 这是关于什么的?它有
嗨, friend 们,是否有可能获得像这样 100% 宽度和高度的双色背景 这是示例图像: Sample Image http://www.mediaserveit.com/demo/vivek/r
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一个网站使用来自谷歌字体的自定义字体。在我的网站上它是正常对齐的,但在我的 android 上,源不对齐。通过各种移动技巧进行研究,我想知道它们是否真的有效,因为经过一项一项的测试,它并没有奏效。
我正在使用... background:url(menu-bg.png) repeat-x, url(spot.gif) repeat; background:url(spot.gif)\0/; 在
我尝试隐藏/显示 div“游戏类型”,但如果输入复选框在列表项中,则以下代码不会运行,我不明白为什么 是否可以在不使用 js 的情况下使用“no-game”输入禁用“pc”和“xbox”输入? inp
简单的问题:我正在 HTML5/Socket.io 中构建一个多人游戏,并使用 Phaser 作为游戏框架。我现在已经进入了为黑客行为添加预防措施的阶段了。 基本上我的问题很简单:潜在的黑客是否可以实
是否有任何方法(hack)插入 Python 函数(def)通过引用返回结果,即使对于不可变类型也是如此? 提案申请(swap as subroutine): def swap(a, b): ....
谁能帮我解决这个问题。我是 css 样式的新手。我有一个 css 文件,其中包含我要构建的 asp.net 网站的所有样式。然而,它在安装了 IE 7 的服务器上运行良好,当我尝试使用 chrome、
以下制作可变大小结构的方法有什么问题? struct tode{ int g; int *p; }; struct tode *lp = malloc(sizeof
我已经停止为不同的浏览器使用 CSS hack,而是支持“条件注释将类添加到 html 标记”方法。 这让我想到了我的问题。我如何编写这个 ie8 hack 没有 hack? .grab-cursor
这样的闭包实现有什么问题吗(从python hack中偷来的)? void function(int value) { struct closure { closure(int
我是一名优秀的程序员,十分优秀!