我在计算机系统课程中,并且一直在与Two's Complement一起挣扎.我想了解它,但我读过的所有内容并没有为我提供图片.我已经阅读了维基百科文章和其他各种文章,包括我的教科书.
因此,我想开始这个社区wiki帖子来定义Two's Complement是什么,如何使用它以及它如何在诸如强制转换(从有符号到无符号,反之亦然)等操作中影响数字,逐位操作和位移操作.
我所希望的是一个清晰简洁的定义,程序员很容易理解.
binary computer-science bit-manipulation twos-complement data-representation
我知道C和C++标准没有规定数字的特定表示(可以是二进制补码,符号和数量等).但我不清楚这些标准(并且无法确定是否已经说明)知道在使用位时是否存在任何特定的限制/保证/保留表示.尤其:
x,我想检查变量y以查看它是否是第5位是1,我想知道是否if (x & y)可行(因为据我所知,这取决于表示的值而不是该位是否实际上是1或0))char c所有位置为真(设置为c = c | ~c)并c = c << (CHAR_BIT - 1)设置高位和c = c ^ (c << 1)低位更简单的方法,假设我没有做任何假设,我不应该这样,给出这些问题)我想我的整体问题是:C和C++标准是否有关于位和整数的限制/保证/保留表示,尽管事实上没有强制表示整数的表示(如果C和C++标准在这方面有所不同) ,他们的区别是什么?)
我在完成作业时提出了这些问题,这需要我做一些操作(注意这些不是我作业的问题,这些都是"抽象的").
编辑:至于我称之为"位",我的意思是"值形成"位而不包括"填充"位.
我正在写一种动态类型的语言.目前,我的对象以这种方式表示:
struct Class { struct Class* class; struct Object* (*get)(struct Object*,struct Object*); };
struct Integer { struct Class* class; int value; };
struct Object { struct Class* class; };
struct String { struct Class* class; size_t length; char* characters; };
Run Code Online (Sandbox Code Playgroud)
目标是我应该能够将所有内容作为a传递struct Object*,然后通过比较class属性来发现对象的类型.例如,要转换一个整数以供使用,我只需执行以下操作(假设它integer是类型struct Class*):
struct Object* foo = bar();
// increment foo
if(foo->class == integer)
((struct Integer*)foo)->value++;
else
handleTypeError();
Run Code Online (Sandbox Code Playgroud)
问题是,据我所知,C标准没有对如何存储结构做出承诺.在我的平台上这是有效的.但是在另一个平台struct String可能存储value之前class和我foo->class在上面访问时我会实际访问foo->value,这显然很糟糕.便携性是这里的一个重要目标.
这种方法有其他选择:
struct …Run Code Online (Sandbox Code Playgroud) 我目前正在研究协议缓冲区的文档.Varints描述为:
varint中的每个字节(最后一个字节除外)都设置了最高有效位(msb) - 这表示还有其他字节.每个字节的低7位用于存储7位组中的二进制补码表示,最低有效组优先.
我的问题是为什么人们会选择在每个字节上丢失一位的表示?这种方法有什么好处?
这是勇敢的脑筋急转弯.我已经好几天了,只是无法提供解决方案.
我想提出这样的事情:

仅使用html,CSS和PHP.
<table border="0">
<thead>
<tr>
<th>Cientoveintiochavos</th>
<th>Seseintaicuatravos</th>
<th>Treintaidosavos</th>
<th>Dieciseisavos</th>
<th>Octavos</th>
<th>Cuartos</th>
<th>Semifinales</th>
<th>Final</th>
</tr>
</thead>
<tbody>
<?php for($i=0;$i<256;$i++): ?>
<tr>
<?php for($n=0,$c=2;$n<8;$n++,$c*=2): ?>
<?php
/*
if(false){//$i == 0) {
$rwspn = $c/2+1;
$iter = 0;
} else {
$rwspn = $c;
$iter = $c;//-$c/2+1;
}
*/
$class = ($i%($c*2))?'par':'impar winner';
if($i%$c==0):?>
<td rowspan="<?=$c;?>" class="<?=$class;?>"><span><?php echo genRandomString();?></span></td>
<?php endif; ?>
<?php endfor; ?>
</tr>
<?php endfor; ?>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
如果有人知道如何表示二叉树或树形图或提出更智能的代码,请告诉我!
从这段对话中,Perl 6的IRC频道,并发布由马丁·巴特的问题时,我试图重现此C代码使用Perl6 NativeCall接口,用于与该目的.这是我尝试过的:
use NativeCall;
my uint32 $num = .new;
my num32 $float = .new: Num(1.0);
sub memcpy(num32 $float, uint32 $num, int32 $size) is native('Str') { * };
memcpy($float,$num,4);
say $num;
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
This type cannot unbox to a native integer: P6opaque, Any
Run Code Online (Sandbox Code Playgroud)
我将其解释为,您已将其声明为整数,我无法将其转换为原始内存,以便可以从此处复制到此处.
这只是回答Martin Barth更常见问题的一种可能方式:如何将原始字节转换为浮点数.也许有其他方法可以做到这一点,但无论如何我都很想知道如何将C程序转换为NativeCall等价物.
更新:与此同时,这是其他帖子试图成为解决方案的原始问题.
这是真的,const_cast会仅仅是一个的方式来告诉编译器"停止呻吟,把它当作一个非const指针"?有没有将const_cast本身转换为实际机器代码的情况?
我想在R中获得最大/最小的可表示数字.
输入".Machine"后
我有:
$double.xmin
[1] 2.225074e-308
$double.xmax
[1] 1.797693e+308
Run Code Online (Sandbox Code Playgroud)
但是,即使我在R命令提示符下键入2.225074e-309,我得到2.225074e-309而不是预期的0
如何找到最大/最小数字,其中加1或减1将导致Inf(添加1到最大数字)或0(从最小数字减去1)?
这一章在现实世界中OCaml中描述了不同数据类型的运行时内存布局。但是,没有关于惰性值的讨论。
lazy_t实现,即它的运行时表示形式是什么以及编译器内置的主要操作是什么?链接到源代码将不胜感激。我查看了CamlinternalLazy模块,但是仅基于对Obj模块中函数的调用,似乎很难解读实际的表示形式。注意:此问题与 OCaml编译器/运行时有关。据我所知,有如何偷懒值应该由没有实施标准规范的 ocaml的编译器/运行。
我正在编写游戏并希望使用数组来表示一个板.我正在寻找效率,因为我要进行多次迭代.在这种情况下,int数组或char数组似乎都很方便用于电路板表示.在int数组和char数组中进行操作时,效率方面有什么不同吗?
我怀疑由于char数组的每个元素都有1个字节的大小,因为内存中的表示形式不同,所以它可能会更慢(考虑到一个现代计算机至少有32位用于int表示)...我是对的吗?
提前致谢.
编辑:我将生成游戏树,这就是效率如此重要以及时间消耗的微小差异可以产生巨大差异的原因.
c ×3
c++ ×2
integer ×2
arrays ×1
binary ×1
binary-tree ×1
const ×1
const-cast ×1
html-table ×1
malloc ×1
memory-model ×1
nativecall ×1
ocaml ×1
perl6 ×1
php ×1
r ×1
string ×1