在汇编编程中,通常需要从寄存器的低位计算某些值,而不保证其他位为零。 在像C这样的高级语言中,只需简单地将input转换为较小的大小,然后让编译器决定是否需要单独清零每个input的高位,或者是否可以在结束之后剔除结果的高位事实。 对于x86-64(也就是AMD64)来说,这是非常常见的,原因有很多,其中一些出现在其他ISA中。 我将用64位x86作为例子,但其目的是一般性地询问/讨论2的补码和无符号的二进制算术,因为所有现代的CPU都使用它 。 (请注意,C和C ++不保证二进制补码4 ,并且这个有符号溢出是未定义的行为。) 作为例子,考虑一个可以编译成LEA指令的简单函数2 。 (在x86-64 SysV(Linux) ABI 3中 ,前两个函数参数在rdi和rsi ,返回值是rax , int是32位types。 ; int intfunc(int a, int b) { return a + b*4 + 3; } intfunc: lea eax, [edi + esi*4 + 3] ; the obvious choice, but gcc can do better ret gcc知道,即使是负符号整数,除了从右到左,input的高位不会影响进入eax 。 因此, 它保存了一个指令字节并使用 lea […]
我已经看到这种模式在C&C ++中使用了很多。 unsigned int flags = -1; // all bits are true 这是一个很好的便携式的方式来完成这个? 或者是使用0xffffffff或0xffffffff更好?
在C中,移位运算符( << , >> )是算术还是逻辑?
例如,对于1, 2, 128, 256输出可以是(16位): 0000000000000001 0000000000000010 0000000010000000 0000000100000000 我试过了 String.format("%16s", Integer.toBinaryString(1)); 它为左填充留出空间: ` 1' 如何把0填充。 我无法在Formatter中find它。 还有另一种方法吗? 提前致谢。 PS 这篇文章描述了如何格式整数与左0填充,但它不是二进制表示。
显然,以下是有效的语法… my_string = b'The string' 我想知道… string的前面是什么意思? 使用它的效果是什么? 什么是适当的情况下使用它。 我在这里find了一个相关的问题 ,但是这个问题是关于PHP的,虽然它说明b是用来表示string是二进制的,而不是unicode,这是需要代码从PHP版本<6兼容时迁移到PHP 6.我不认为这适用于Python。 我没有在python网站上find关于在同一语法中使用u字符来指定一个string为unicode的文档 。 不幸的是,它没有提到该文件中任何地方的b字符。 另外,出于好奇,除了b和u之外,还有其他的符号吗?
我参加了计算机系统课程,并且一直在挣扎 ,部分与Two的补充 。 我想了解它,但是我读过的所有东西都没有为我带来这幅画。 我已阅读维基百科文章和其他各种文章,包括我的课本 。 因此,我想开始这个社区维基的post来定义什么是补码是什么,如何使用它,以及它如何影响数字操作(如从签名到无符号,反之亦然),按位操作和位移操作。 我所希望的是一个清晰简洁的定义 ,程序员很容易理解。
表示数字7的8位看起来像这样: 00000111 三位被设置。 什么algorithm来确定一个32位整数的设置位数?
我需要使用二进制数字。 我试着写: const x = 00010000; 但它没有工作。 我知道我可以使用与00010000具有相同值的十六进制数字,但是我想知道在C ++中是否存在二进制数字类型,如果没有,是否有另一种解决方案?