正如你在这里看到的,我有一个无符号变量和一个带有相同二进制值但不同小数结果的带符号变量.
uint unsigned = 0xFFFFFFFF; // 4,294,967,295
int signed = 0xFFFFFFFF; // -1
Run Code Online (Sandbox Code Playgroud)
我真的很困惑!在所有32/64位全部打开之后,机器如何区分有符号和无符号.是否有一个完全用于此的CPU 标志?CPU如何知道无符号和有符号数之间的区别?试着理解这几个小时的概念!
或者......另一个例子......让我们拿4位:
// 1 1 0 1 <--- -3
// 0 0 1 0 <--- 2
Run Code Online (Sandbox Code Playgroud)
如果我们从-3减去2,结果将是:
// 1 0 0 1 <--- -1 or 9???
Run Code Online (Sandbox Code Playgroud)
cpu将产生该结果,但我的应用程序如何知道它是-1还是9?在编译时已知预期的结果类型?
另一个例子...
int negative = -1;
Console.WriteLine(negative.ToString("X")); //output FFFFFFFF
uint positive = 0xFFFFFFFF;
Console.WriteLine(positive.ToString("X")); //output FFFFFFFF
Run Code Online (Sandbox Code Playgroud)
稍后编辑:
我用这些东西搞砸了一点,我觉得我得到了它,请纠正我,如果我错了:我们有以下例子:
sbyte positive = 15; //0xF ( 0000 1111)
sbyte negative = unchecked((sbyte)-positive); //0xF01;( 1111 0001)
sbyte anotherPositive = 7; //0x7 ( 0000 0111)
sbyte result = (sbyte)(negative + anotherPositive);
//The cpu will add the numbers 1111 0001
// 0000 0111
// 1111 1000
// (Addition result is 248 but our variable is
//SIGNED and we have the sign bit ON(1) so the the value will be interpreted as -8)
Run Code Online (Sandbox Code Playgroud)
我真的很困惑!在所有32位全部打开后,机器如何在低电平之间产生差异.
机器没有; 编译器.编译器知道变量的类型signed和unsigned变量(忽略了C和C++中的关键字signed和unsigned关键字这一事实).因此,编译器根据这些类型知道要生成什么指令以及调用哪些函数.
类型之间的区别是在编译时进行的,根据其编译时类型更改可能相同的原始数据的解释.
考虑打印变量值的示例.当你写作
cout << mySignedVariable << " " << myUnsignedVariable << endl;
Run Code Online (Sandbox Code Playgroud)
编译器看到应用了两个<<运算符的重载:
<<一个打电话给ostream& operator<< (int val);<<个打电话给ostream& operator<< (unsigned int val);一旦代码到达正确的操作符实现,您就完成了:为特定重载生成的代码具有如何处理"烘焙到"其机器代码中的有符号或无符号值的信息.其采用的实施int而无符号实现使用不同的指令,产生所需的结果用途比较,部门,乘法等签订机器指令.
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |