相关疑难解决方法(0)

签名与无符号整数

我是否正确地说有符号和无符号整数之间的区别是:

  1. 无符号可以保持较大的正值,而不是负值.
  2. 无符号使用前导位作为值的一部分,而带符号版本使用最左侧位来标识数字是正数还是负数.
  3. 有符号整数可以包含正数和负数.

还有其他差异吗?

language-agnostic unsigned signed integer

378
推荐指数
11
解决办法
35万
查看次数

为什么unsigned int 0xFFFFFFFF等于int -1?

在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,我只是想知道为什么.

c c++ binary casting

26
推荐指数
3
解决办法
7万
查看次数

在 Go 中,什么时候应该使用 uint 和 int?

乍一看,当您需要一个不希望为负数的 int 时,似乎人们可能会选择 uint 。然而,在实践中似乎 int 几乎总是首选。

我看到的一般建议如下:

  • “通常,如果您使用整数,则应该使用 int 类型。”
  • “uint 通常应该只用于进行二进制运算”
  • “不要使用无符号类型来强制或建议数字必须为正数。那不是它们的用途。”
  • “这是 Go 编程语言所推荐的,当您想要进行按位运算时,uint 的具体示例非常有用”

我还注意到 Go 会让你将负 int 转换为 uint 并给出一些奇怪的结果:

    x := -5
    y := uint(x)
    fmt.Println(y)

>> 18446744073709551611
Run Code Online (Sandbox Code Playgroud)

所以,我的理解是,在处理整数时我应该始终使用 int,无论符号如何,除非我发现自己需要 uint,并且在这种情况下我会知道(我认为???)。

我的问题:

  • 这是正确的外卖吗?
  • 如果是这样,为什么会这样呢?
  • 什么时候应该使用 uint 的例子是什么?-- 也许是一个具体的例子,而不是“进行二进制操作时”,因为我不确定我知道这意味着什么:)

另外,我问的是 Go 的具体实现。

go

10
推荐指数
2
解决办法
1万
查看次数

为什么unsigned int可能低于零?

我只是试图将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?或者是其他东西?

c variables int unsigned

4
推荐指数
1
解决办法
374
查看次数

标签 统计

c ×2

unsigned ×2

binary ×1

c++ ×1

casting ×1

go ×1

int ×1

integer ×1

language-agnostic ×1

signed ×1

variables ×1