gpt4 book ai didi

c - 机器之间 "short"的范围是否不同?

转载 作者:行者123 更新时间:2023-12-04 11:59:33 25 4
gpt4 key购买 nike

谁能告诉我 C 中 short 的范围在不同机器上是否不同。例如,如果 short 是 2 个字节,在 1 的补码机中,short 的范围将为 -32767 ~ 32767,在 2 的补码机中,范围将为 -32768 ~ 32767 。提前致谢。

最佳答案

是的,类型的范围和大小short在不同的机器上有所不同。它甚至可以在同一台机器上的不同实现中有所不同。

最常见的表示是 16 位二进制补码,没有填充位或陷阱表示,范围为 -32768 到 +32767。

C 标准要求 short覆盖 至少 -32767 到 +32767 的范围,但它可以更大。

我曾在 short 的系统上工作过是 32 位 (Cray T3E) 甚至 64 位 (Cray T90)。

如果可能的话,您应该编写不假定 short 的特定范围或大小的代码。 ,或任何其他预定义类型。使用 SHRT_MINSHRT_MAX , 在 <limits.h> 中定义, 如果你需要边界,使用 sizeof (short) ,(或者更好,sizeof obj,其中 obj 是类型为 short 的对象)如果您需要大小。

如果您需要正好 16 位的类型,请使用int16_t , 在 <stdint.h> 中定义和 <inttypes.h> . (这些头文件是在 1999 版的 C 标准中添加的,但大多数编译器应该都支持它们。)

回应您询问溢出的评论:

当您谈论类型 short 时,溢出问题会变得有点棘手。 .整数文字,如 32767绝不是 short 类型;它们总是类型 int或更大的东西。算术运算符的操作数首先应用“通常的算术转换”; short操作数被悄悄提升为 int .

在 C 中,没有 + short 类型的运算符.

考虑一下:

short x = 32767;
x = x + 1;

在表达式 x + 1 中, 操作数 xshort 提升至 int (并且 1 已经是 int 类型)。这会产生 int 类型的结果,这将是 32768如果int足够宽以存储该值。 (如果不是,溢出会导致未定义的行为,但我们将忽略它。)然后 int32768int转换short在存储在 x 之前.

如果SHRT_MAX > 32767 , 这里没有问题;转换产生预期值 32768 , 它存储在 x 中.

但是如果 SHRT_MAX == 32767 (这是最常见的情况),那么 int 的转换值 32768short 产生一个实现定义的值(或引发一个实现定义的信号),如 C99 中所述第 6.3.1.3 节。

最常见的是,实际结果是-32768 ,表示为 short如果系统使用二进制补码(几乎所有系统都这样做)。但严格来说,代码不可移植,它可以x 中存储一些其他任意结果。 ,甚至在实现决定发出信号时终止您的程序(我不知道有任何这样做的人)。

关于c - 机器之间 "short"的范围是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com