【问题标题】:Why is a signed int is auto-casted to an unsigned int if the computer is "copying bits"?如果计算机正在“复制位”,为什么有符号整数会自动转换为无符号整数?
【发布时间】:2015-01-09 15:39:04
【问题描述】:

我最近在学习C,有些东西我看不懂。

这是一个例子,

int a = -1;
unsigned int b = a; 

在这个例子中,书中说,

  "a is auto-casted to 'unsigned int' and then assigned to 'unsigned int b'."

但是……为什么?我是说

'int a'是-1,所以它的位串应该是

1111 1111 1111 1111 1111 1111 1111 1111

从计算机的角度来看,它所要做的就是将位复制到 unsigned int b

无需将 'signed int' 转换为 'unsigned int' !

我不明白,为什么他们在复制位之前自动将 'signed int' 转换为 'unsigned int'?

【问题讨论】:

  • 好吧,考虑一下您的代码会发生什么。 -1 是无符号变量的不可能值。那么如果你分配了一个不可能的值应该怎么办?
  • bunsigned int 并且您将这些位从 a 复制到它。这些位实际上没有任何变化,只是将它们作为无符号值而不是有符号来处理的方式,最高位不再是符号位,而是数字的一部分。
  • 当您进行有符号/无符号转换时,存储在内存中的位模式实际上并没有改变。只是解释不同而已。
  • 位不会改变,改变的是类型改变时读取位的方式。
  • 请问这是什么书?那是直接引用吗?

标签: c casting int bit unsigned


【解决方案1】:

嗯...当您使用signed int 值初始化unsigned int 对象时,肯定需要将unsigned int 转换为signed int。这正是您通过在初始化中混合这两种不同类型来要求语言做的事情。当您使用不同类型 U 的值初始化类型为 T 的对象时,必须将类型 U 隐式转换为类型 T。 (或者如果没有适当的转换,则必须报告错误。)没有办法解决它。除了转换之外,没有办法“配对”两种不同的类型。

此外,没有“位复制”之类的东西。我不知道为什么你的书决定在这种情况下发明这样的概念。当singed int 值转换为unsigned int 类型时,有符号值会按照模运算规则进行转换。这就是你的情况。在 2 的补码平台上,转换是概念性的,这意味着值的位表示不会改变(这显然是“位复制”的意思)。

【讨论】:

  • 所以.. '=' 不只是复​​制位 :) 谢谢!
  • @S.帕特里克:嗯,实际上它可能归结为在编译代码中“只是复制位”。但是语言本身并没有用这样的术语来描述它。语言用更高级的概念来描述它,比如“转换”和“模算术”。但是在许多(或大多数)现代硬件平台上,这些概念对实际的机器代码没有影响。它们消散得无影无踪。
  • 在补码(范围重叠的地方)正符号整数也具有与无符号相同的表示形式,我认为标准要求这种重叠
【解决方案2】:

C 通过值而不是表示来为变量赋值。 -1 显然不能以无符号类型表示,因此必须进行转换。这里的规则(从有符号类型到无符号类型)是“模”转换,因此-1 最终是无符号类型的最大值。

如果您想通过表示来“分配”,则必须使用复制功能,例如 memcpy,但请注意,如果目标不支持原始位模式,这可能会导致未定义的行为输入。

此外,对于词汇,在 C 中我们说的是“转换”。您在这里拥有的是隐式转换。显式转换也称为“强制转换”。

您的书似乎没有意识到所有这些,并且使用了奇怪的词汇。如果你能给自己一个更好的新人,可能会更好。

【讨论】:

    【解决方案3】:

    太多的程序员受过这样的教育,他们在编写程序时假设所有负数都表示为 2 的补码,并假设有符号/无符号转换是按位复制的。

    然而语言无意强制每台计算机/编译器都以这种方式表示负数,尽管它很流行。

    C 放宽了对负数表示的要求,以提供更大的实现灵活性,但同时将“常规”的 2's-complement-bitwise-copy 类型转换作为标准的一部分,以便大多数时候,那些错误的假设不会造成问题。

    【讨论】:

    • 谢谢!我以为他们以同样的方式运行。
    猜你喜欢
    • 2016-02-17
    • 2022-06-28
    • 1970-01-01
    • 2014-02-20
    • 2013-09-01
    • 2017-07-21
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多