2011-05-25 113 views
1

让我们假设我有一个C脚本,并且声明了一些unsigned int。然后,我编写一个while循环,它会自动增加这些值并将其打印出来:在用户将其从命令行中停下来之前没有限制。一旦我达到非常高的数字(20亿),计算机就从数百亿开始计算。我怎样才能防止这一点?看,我可以轻松地键入,比如说,“99999999999999”,而不会造成任何崩溃:为什么我不能在我的32位终端上执行此操作?我已经尝试了很长很长的int,签名和未签名,但我仍然有这个问题。下面是截图:http://img577.imageshack.us/img577/6558/schermata20110524a01012.pngsigned/unsigned int

感谢, J.

+2

C不是一种脚本语言。 ;) – 2011-05-25 01:58:32

+2

您可能正在使用未签名的存储,但您将其打印为已签名。如果您使用printf使用%u而不是%i或%d。 – ughoavgfhw 2011-05-25 02:01:34

回答

2

计算机有没有符号/无符号,它的值的解释事情的概念。取决于您如何定义数据类型,相同的值可以解释为-1或解释为65535。在你的情况下 - 循环永远不会进入负数,因为对于那种数据类型 - 没有这样的事情。相反,正范围将大于signed int

至于截图 - 你打印如何?例如,如果您使用%d打印 - 则会将值解释为signed。改用%u来让程序将值解释为unsigned

2

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

%i会认为int是有符号的,即使它不是。要打印一个无符号整数,请使用%u

+0

printf(“%i”,i) – Joseph 2011-05-25 02:03:05

+0

'%i'只适用于'int','signed int'和'short'。对于'unsigned int',你应该使用'%u',对于'unsigned long long','%llu'(但是请注意某些版本的Windows使用非标准说明符) – Thanatos 2011-05-25 02:06:11

+0

亲切 - 谢谢!多大的unsigned int可以是多少?我想存储一个可能容易超过20亿的值! – Joseph 2011-05-25 02:08:57

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各类非标格式说明。

+0

我试图从int更改为long long int,但结果与上面张贴的屏幕截图相同:( – Joseph 2011-05-25 02:03:54

+0

@Joseph:查看有关使用'printf'的转换说明符的帖子,这可能是为什么您的用'long long int'尝试失败。 – Thanatos 2011-05-25 02:08:12

0

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

如果你说

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

那么即使int是无符号的,(假设你没有一个编译器,这样的事情发出警告,)printf将把它作为一个签署 INT(因为这就是%d的含义)。

尝试%u而不是%d

一旦你修好了,意识到在一个32位系统上,一个int(有或没有)通常只有32位大小,因此只能保持大约40亿的值。如果你想要比这更大的值,你需要一个更大的类型(如long long)。如果你这样做,你需要改变你的格式字符串到"%ull\n"(或"%llu"?我忘记),或者谁知道你会得到什么。

相关问题