签名/未签名的整数

时间:2011-05-25 01:57:35

标签: c int signed

假设我有一个C脚本,我声明了一些unsigned int。然后,我编写了一个while循环,它会自动增加这些值并将其打印出来:在用户从命令行停止之前没有限制。一旦达到非常高的数字(2billions),计算机就会从-2亿个数量开始计算。我怎么能阻止这个?看,我可以轻松打字,比方说“99999999999999”而不会导致任何崩溃:为什么我不能在我的32位终端上执行此操作?我尝试过long long int,签名和unsigned,但我仍然有这个问题。这是截图:http://img577.imageshack.us/img577/6558/schermata20110524a01012.png

谢谢, 学家

4 个答案:

答案 0 :(得分:2)

计算机没有签名/未签名的概念,这是对价值的解释。相同的值可以解释为-1或65535,具体取决于您定义数据类型的方式。在你的情况下 - 循环永远不会进入负数,因为对于那种数据类型 - 没有这样的东西。相反,正范围将大于signed int的范围。

截至屏幕截图 - 你是如何打印的?如果您使用%d进行打印,则会将值解释为signed。请使用%u让程序将值解释为unsigned

答案 1 :(得分:2)

你是如何打印出来的?您使用的是printf("%u", i)还是printf("%i", i)

%i会认为int已签名,即使它不是。要打印unsigned int,请使用%u

答案 2 :(得分:1)

32位数字的范围受到限制,因为它只有32位。您不能以32位存储60-70-等位数。

你可以使用像unsigned long long这样的东西,它可能是64位,因此范围更大,但它仍然有一个限制。 (2 ^ 64,但它是非常大号)。如果你真的需要“无限制”,请查看bigint库,例如GMP。


修改:正如其他海报所示,请确保您在格式字符串中使用正确的转化说明符printf

  • %d%iintsigned intshort
  • %uunsigned intunsigned short
  • %lluunsigned long long
  • %lld%llilong long

请注意,某些版本的Windows具有long long类型的非标准格式说明符。

答案 3 :(得分:0)

部分是关于如何打印价值。

如果你说

printf("%d\n", your_unsigned_int);

然后即使in​​t是无符号的(假设您没有编译器警告这些事情,)printf会将其视为签名 int(因为那是什么%d表示)。

尝试使用%u代替%d

一旦你修复了这一点,就会意识到在32位系统上,int(有符号或无符号)通常只有32位大小,因此只能保存最多约40亿的值。如果您想要大于该值的值,则需要更大的类型(如long long)。如果你这样做,你需要将格式字符串更改为"%ull\n"(或"%llu"?我忘了)...或者谁知道你会得到什么。