【问题标题】:Unsigned int takes negative values [duplicate]无符号整数采用负值[重复]
【发布时间】:2012-06-27 10:31:57
【问题描述】:

有人可以解释为什么 unsigned int 取负值吗? unsigned int 应该只取正值。

来自Wikipedia

word, long, doubleword, longword, int

无符号:从 0 到 4,294,967,295,等于 2^32 - 1

#include <stdio.h>
typedef unsigned int uint32;

int main()
{
     uint32 i;
     int x = -1;
     i = x%32;
     printf("\n\n Value of uint32 i = %d", i);
     return (0);
}

输出:

Value of uint32 i = -1

以下是我在 cpp 标准中找到的解释,我无法解释。

对于每一种有符号整数类型,都存在一个对应的(但不同的)无符号整数类型:“unsigned char”、“unsigned short int”、“unsigned int”和“unsigned long int”,它们分别占与相应的有符号整数类型相同的存储量和对齐要求(3.9);也就是说,每个有符号整数类型都具有与其对应的无符号整数类型相同的对象表示。有符号整数类型的非负值范围是对应无符号整数类型的一个子范围,每个对应的有符号/无符号类型的值表示应相同。

4 个无符号整数,声明为无符号,应遵守算术模 2n 的定律,其中 n 是该特定整数大小的值表示中的位数

40) 关于类型和指定它们的类型说明符序列之间的对应关系,请参见 7.1.5.2。

41) 这意味着无符号算术不会溢出,因为无法由结果无符号整数类型表示的结果会以比结果无符号整数可以表示的最大值大一的数字为模减少 输入。

【问题讨论】:

  • 这里的教训是printf 不是类型安全的。

标签: c++ c


【解决方案1】:

您为printf 使用了错误的标志。应该是%u

printf("\n\n Value of uint32 i = %u", i);

【讨论】:

    【解决方案2】:

    可以用多种不同的方式解释相同的位模式。有符号整数和无符号整数之间的唯一区别在于解释它们的位模式的方式。您的代码指示 printf 将 unsigned int 解释为有符号,这就是您看到负数的原因。

    作为一个实验问题,试试这个:

    printf("%u\n", -1);
    

    这将产生一个很大的正数 - 与您在帖子中描述的情况正好相反。同样,printf 被要求将有符号数解释为无符号数,因此它很乐意将符号扔掉,并像无符号一样打印该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多