- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
根据 C99 标准中的以下两个条款:
6.2.5-9
The range of nonnegative values of a signed integer type is a subrange of the corresponding unsigned integer type, and the representation of the same value in each type is the same.
6.2.6.2-2
For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. There need not be any padding bits; there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as the same bit in the object representation of the corresponding unsigned type (if there are M value bits in the signed type and N in the unsigned type, then M ≤ N ).
有符号类型(可能)可以表示相应无符号类型可表示的所有数字。例如,如果 unsigned int
类型使用 31 个值位和 1 个填充位表示,而 signed int 使用 31 个值位且无填充位表示。
是否允许实现这样做?如果是,这是否意味着在这种情况下 unsigned int
将被提升为 int
(因为两种类型具有相同的转换等级和 int
可以代表unsigned int
代表的所有值)?
最佳答案
It is (probably) possible for a signed type to represent all numbers representable by the corresponding unsigned type. For example, if the unsigned int type is represented using 31 value bits and 1 padding bit and the signed int is represented using 31 value bits and no padding bits. Is an implementation allowed to do so?
标准在6.3.1.8 普通算术转换
中建立:
Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands: If both operands have the same type, then no further conversion is needed.
Otherwise, if both operands have signed integer types or both have unsigned integer types, the operand with the type of lesser integer conversion rank is converted to the type of the operand with greater rank.
Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
由于 int
和 unsigned int
具有相同的等级(6.3.1.1 bool 、字符和整数
),int
将转换为 unsigned int
,但反之则不然:
— The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type, if any.
以u
为后缀的整数常量始终是无符号的(参见6.4.4.1 整数常量
中的表格)。
6.3.1.1 bool 值、字符和整数
第 2 条还告诉我们:
The following may be used in an expression wherever an int or unsigned int may be used:
— An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int.
— A bit-field of type _Bool, int, signed int, or unsigned int.
If an int can represent all values of the original type, the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions. All other types are unchanged by the integer promotions.
所以,不,实现不能合法地将 unsigned int
转换为 int
,除非您通过强制转换或赋值明确要求。
编辑:6.3.1.1 bool 值、字符和整数
的第 2 条内容如下:
— An object or expression with an integer type whose integer conversion rank is less than the rank of int and unsigned int.
(国际标准 ISO/IEC 9899 第二版 1999-12-01)
— An object or expression with an integer type whose integer conversion rank is less than or equal to the rank of int and unsigned int.
(WG14/N1256 委员会草案 — 2007 年 9 月 7 日 ISO/IEC 9899:TC3)
— An object or expression with an integer type (other than int or unsigned int) whose integer conversion rank is less than or equal to the rank of int and unsigned int.
(N1548 委员会草案 — 2010 年 12 月 2 日 ISO/IEC 9899:201x,
N1570 委员会草案 - 2011 年 4 月 12 日 ISO/IEC 9899:201x)
为了好玩,C++11 的 4.5 Integral promotions [conv.prom]
:
A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int.
(N3242=11-0012,
N3337 日期:2012-01-16,
国际标准 ISO/IEC 14882 第三版 2011-09-01)
关于c - 理论上是否有可能实现将 unsigned int 提升为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15701588/
我正在尝试使用 y 组合器在 Scala 中定义 gcd: object Main { def y[A,B]( f : (A => B) => A => B ) : A => B = f(y(f)
我正在尝试了解返回指向函数的指针的函数,在我尝试编译代码后,它给了我这种错误: cannot convert int (*(int))(int) to int (*(int))(int) in ass
所以我一直在关注 youtube 上的游戏编程教程,然后弹出了这段代码:bufferedImageObject.getRGB(int, int, int, int, int[], int, int);
我正在将时间现在 与存储在数据库某处的时间进行比较。数据库中存储的时间格式为“yyyyMMddHHmmss”。例如,数据库可能会为存储的时间值返回 201106203354。然后我使用一个函数将时间现
例如 Maze0.bmp (0,0) (319,239) 65 120 Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) Maze0.bmp (0,0) (
评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style
我正在研究 C 的指针,从 Deitel 的书中我不明白 int(*function)(int,int) 和 int*function(int, int) 表示函数时。 最佳答案 C 中读取类型的经验
您好,我使用 weblogic 11g 创建 war 应用程序,我对 joda time 的方法有疑问 new DateTime(int, int, int, int, int, int); 这抛出了
Create a method called average that calculates the average of the numbers passed as parameters. The
var a11: Int = 0 var a12: Int = 0 var a21: Int = 0 var a22: Int = 0 var valueDeterminant = a11 * a12
我正在为一个项目设置 LED 阵列。我得到了一个 LED 阵列,可以根据引脚变化电压进行更改,但我无法添加更多引脚。 当我尝试时,编译失败并显示错误:函数“int getMode(int, int,
除了创建对列表执行简单操作的函数之外,我对 haskell 还是很陌生。我想创建一个列表,其中包含 Int 类型的内容, 和 Int -> Int -> Int 类型的函数. 这是我尝试过的: dat
这个问题已经有答案了: Java add buttons dynamically as an array [duplicate] (4 个回答) 已关闭 7 年前。 StackOverFlow问题今天
我有几个 EditText View ,我想在其中设置左侧的图像,而 setCompoundDrawablesWithIntrinsicBounds 似乎不起作用。图形似乎没有改变。 有人知道为什么会
#include using namespace std; int main() { static_assert(is_constructible, int(*)(int,int)>::val
fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x),或者 sum(*x) 当然,以上都不能用 Kotlin 1.1.3
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
type foo = A of int * int | B of (int * int) int * int 和 (int * int) 有什么区别?我看到的唯一区别在于模式匹配: let test_
我正在尝试制作一个 slider 游戏。在这个类中,我使用 Graphics 对象 g2 的 drawImage 方法来显示“拼图”的 block 。但在绘制类方法中,我收到此错误:找不到符号方法dr
我试着理解这个表达: static Func isOdd = i => (i & 1) == 1; 但是这是什么意思呢? 例如我有 i = 3。然后 (3 & 1) == 1 或 i = 4。然后
我是一名优秀的程序员,十分优秀!