我是否正确地说有符号和无符号整数之间的区别是:
还有其他差异吗?
在C或C++中,可以说size_t(无符号整数数据类型)可以容纳的最大数量与向该数据类型强制转换-1相同.例如,请参阅size_t的无效值
为什么?
我的意思是,(谈论32位整数)AFAIK最重要的位保持有符号数据类型的符号(即,位0x80000000形成负数).那么,1是0x00000001 .. 0x7FFFFFFFF是int数据类型可以容纳的最大正数.
然后,AFAIK的-1 int的二进制表示应该是0x80000001(也许我错了).为什么/如何将这个二进制值转换为完全不同的任何东西(0xFFFFFFFF)时将int转换为unsigned?或..如何形成0xFFFFFFFF的二进制-1?
我毫不怀疑在C :((unsigned int)-1)== 0xFFFFFFFF或((int)0xFFFFFFFF)== -1同样真实而不是1 + 1 == 2,我只是想知道为什么.
乍一看,当您需要一个不希望为负数的 int 时,似乎人们可能会选择 uint 。然而,在实践中似乎 int 几乎总是首选。
我看到的一般建议如下:
我还注意到 Go 会让你将负 int 转换为 uint 并给出一些奇怪的结果:
x := -5
y := uint(x)
fmt.Println(y)
>> 18446744073709551611
Run Code Online (Sandbox Code Playgroud)
所以,我的理解是,在处理整数时我应该始终使用 int,无论符号如何,除非我发现自己需要 uint,并且在这种情况下我会知道(我认为???)。
我的问题:
另外,我问的是 Go 的具体实现。
我只是试图将unsigned int降低到0以下.令我惊讶的是它有效!
#include<stdio.h>
int main(void)
{
unsigned int foo = 5;
foo -= 10;
printf("%d", foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译
clang -Weverything main.c
Run Code Online (Sandbox Code Playgroud)
这个计划回归
-5
Run Code Online (Sandbox Code Playgroud)
正如这篇文章和我的个人知识所述,这是不可能的.但为什么它会起作用呢?我错过了什么吗?是因为未定义的行为?还是printf?或者是其他东西?