ISO C标准允许三种编码方法用于有符号整数:二进制补码,一个补码和符号/幅度.
在运行时检测编码的有效或好方法是什么(或者如果有更好的解决方案,还有其他时间)?我想知道这一点,所以我可以针对不同的可能性优化bignum库.
我计划计算这个,并在每次程序运行时将其存储在一个变量中,所以它不必非常快 - 我假设在程序运行期间编码不会改变:-)
位运算符(~,&,|和^)在他们的推动数的按位表示操作.这样的操作会导致不确定的行为吗?
例如,~运算符在C标准中以这种方式定义:
6.5.3.3一元算术运算符
~运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换的操作数中的相应位时,才会设置结果中的每个位).整数提升在操作数上执行,结果具有提升类型.如果提升的类型是无符号类型,则表达式~E等效于该类型中可表示的最大值减去E.
在所有体系结构上,~0生成一个位模式,其符号位设置为1,所有值位设置为1.在一个补码架构上,该表示对应于负零.这个位模式可以成为陷阱表示吗?
是否存在涉及更常见架构的简单位运算符的未定义行为的其他示例?
有没有一种简单的方法可以在python中生成一个补码?
例如,如果你取十六进制值0x9E,我需要将其转换为0x61.
我需要将二进制1换成0,将0换成1.感觉这应该很简单.
检测架构是否在C++中使用一个或两个补码表示的最可靠方法是什么?
在一个补码架构上考虑以下代码:
int zero = 0;
int negzero = -0;
std::cout<<(negzero < zero)<<std::endl;
std::cout<<(negzero <= zero)<<std::endl;
std::cout<<(negzero == zero)<<std::endl;
std::cout<<(~negzero)<<(~zero)<<std::endl;
std::cout<<(1 << negzero)<<std::endl;
std::cout<<(1 >> negzero)<<std::endl;
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual Studio 2013.
最近我尝试了~运算符1的补码:
int a = 10;
cout << ~a << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 -11
但对于
unsigned int a = 10;
cout << ~a << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 4294967296
我不明白为什么输出是-11签名的情况int.请帮我解决这个困惑.
考虑下面的java代码.
Integer value = Integer.MIN_VALUE;
System.out.println(value);
value = -value;
System.out.println(value);
Run Code Online (Sandbox Code Playgroud)
产量
-2147483648
-2147483648
Run Code Online (Sandbox Code Playgroud)
价值的负值如何产生Integer.MIN_VALUE相同的价值?
但结果不能是2147483648因为java中Integer的最大值是2147483647.
但想知道为什么-2147483648?内部发生了什么样的按位操作?
我已经看过这两者,(size_t)-1并~0曾经代表大数字,或者数字都被翻转过。
两者之间有什么区别吗?如果是这样,那是什么?
我发现了一个问题:-1和〜0之间有什么区别,但是它没有回答我的问题,因为我正在处理无符号整数(例如size_t),而不是有符号整数(例如int)。
从维基百科的文章似乎的补代表性符号整数基本上是过时的,但他们提一些优利系统,即UNIVAC2200分之1100系列作为仍然支持这种表示。
Unisys Clearpath 系列中的最新系统是否仍然支持和使用其补充?
既然他们使用intel芯片,他们需要模拟器吗?这性能如何?
是否有针对这种架构的 C 编译器?
我想在输入二进制数后制作一个程序来计算1的补码.这就是我所要做的:
import java.util.Scanner;
public class BitWiseComplement {
public static void main(String[] args) {
Scanner keysIn = new Scanner(System.in);
System.out.println("Please enter your number: ");
long originalNum = keysIn.nextLong();
System.out.println(~originalNum);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我输入0111011时,我得到-111012.我认为〜运算符应该反转数字,以便所有0都是1,所有1都是0.
有帮助吗?