- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能告诉我 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_MIN
和 SHRT_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
中, 操作数 x
从 short
提升至 int
(并且 1
已经是 int
类型)。这会产生 int
类型的结果,这将是 32768
如果int
足够宽以存储该值。 (如果不是,溢出会导致未定义的行为,但我们将忽略它。)然后 int
值 32768
从int
转换至 short
在存储在 x
之前.
如果SHRT_MAX > 32767
, 这里没有问题;转换产生预期值 32768
, 它存储在 x
中.
但是如果 SHRT_MAX == 32767
(这是最常见的情况),那么 int
的转换值 32768
至 short
产生一个实现定义的值(或引发一个实现定义的信号),如 C99 中所述第 6.3.1.3 节。
最常见的是,实际结果是-32768
,表示为 short
如果系统使用二进制补码(几乎所有系统都这样做)。但严格来说,代码不可移植,它可以在x
中存储一些其他任意结果。 ,甚至在实现决定发出信号时终止您的程序(我不知道有任何这样做的人)。
关于c - 机器之间 "short"的范围是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919664/
C# 程序: short a, b; a = 10; b = 10; a = a + b; // Error : Cannot implicitly convert type 'int' to 'sh
这个问题已经有答案了: Promotion in Java? (5 个回答) 已关闭10 年前。 我有三个短变量。当我将两个相加并将结果分配给第三个时,Eclipse 告诉我需要将其转换为 Short
我正在开展一个项目,我需要获取一系列带符号的 16 位整数、负值和正值,并将它们发送到函数以在单元测试期间进行分析。 由于不同的原因,该函数仅采用无符号 16 位整数数组,因此我需要将有符号整数存储在
这个问题在这里已经有了答案: Implicit type promotion rules (4 个答案) 关闭 3 年前。 有如下代码: short a = 5; short b = 15; sho
我有以下代码: var v = [0xFF, 0xFF]; alert((v[0]> 16); 16位左移将所有位向左移动;算术 16 位右移在移位时处理符号。 (Javascript 使用 32 位
我正在尝试尽可能多地挤出我的内存。我有一个 4.9999995e13 整数矩阵,但它们只需要为真或假 - 基本上我只需要为这些整数中的每一个存储一位。 我知道 C 中没有单个位类型(也许有人可以向我解
这个问题已经有答案了: Different between parseInt() and valueOf() in java? (11 个回答) 已关闭 5 年前。 我最近偶然发现了another q
当我将相同的值分配给有符号和无符号的 short 并进行比较时,它失败了,但它适用于 int。除非我强制转换一个或另一个使它们成为相同的类型,否则比较不起作用。 #include int main()
所以我试图解释以下输出: short int v = -12345; unsigned short uv = (unsigned short) v; printf("v = %d, uv = %u\n
当我将相同的值分配给有符号和无符号的 short 并进行比较时,它失败了,但它适用于 int。除非我强制转换一个或另一个使它们成为相同的类型,否则比较不起作用。 #include int main()
这个问题在这里已经有了答案: What is the 'short' data type in C? (1 个回答) 关闭 7 年前。 将变量声明为 short int 和 short 有什么区别?
C 中的 short int 包含 16 位,第一位表示该值是负数还是正数。我有一个 C 程序如下: int main() { short int v; unsigned short
Short.parseShort(String s, int radix) 存在,Integer.parseInt(String s, int radix) 和 Long.parseLong(Stri
我想我可以从 this question 推断出来但我不能 我当然可以 short[] shortarray = {0,1,2}; List shortList = new ArrayList();
这个问题在这里已经有了答案: char and the usual arithmetic conversion rules (5 个答案) 关闭 6 年前。 假设 int 是 16 位类型,以防止从
到目前为止我已经试过了,但我仍然在下面的代码中遇到错误: #include typedef unsigned short unichar; typedef const unichar unimap_t
unsigned short int 和 c 中的 unsigned short decleration 之间有区别吗?如果有,那是什么?我尝试在网上查找,但找不到任何有值(value)的东西。 un
我有数据库,由于与另一位开发人员混淆,我需要在一个表中更改列的值。我有一个名为 credits 的表和一个名为 credit_type 的列。 credit_type 有 2 个值 long 和 sh
我在 JNI hell 中进行类型转换: 这是一般的流程: 读取一个文件,它返回一个一维 float 组。 转换这些floats[] 到 shorts[](*4095,我想要一个12位数字) 将这些短
我正在尝试优化两个 c 样式数组的点积,这些数组的大小为 contant 和 small,类型为 short。 我已经阅读了一些关于 SIMD 内在函数的文档以及许多关于使用此内在函数进行点积优化的博
我是一名优秀的程序员,十分优秀!