Tag: 标准

Bitshift和整数推广?

通常,C要求将二元运算符的操作数提升为更高级别操作数的类型。 这可以被利用来避免用详细的强制转换来填充代码,例如: if (x-48U<10) … y = x+0ULL << 40; 等等 但是,我发现,至少对于gcc,这种行为不适用于位移。 即 int x = 1; unsigned long long y = x << 32ULL; 我希望右手操作数的类型能够将左手操作数提升为unsigned long long以便移位成功。 但相反,gcc会打印一个警告: warning: left shift count >= width of type gcc是否被破坏,或者标准是否对比特提升的类型提升规则有所例外?

C标准支持的平台列表

有没有人知道C标准支持的任何平台,仍然有积极的开发工作,但它们是: 不是2的补充或 整数宽度不是32位或64位或 某些整数类型有填充位或 如果您使用2的补码机器,符号位1和所有值位0的位模式不是有效的负数或 从有符号到无符号的整数转换(反之亦然)不是通过逐字复制位模式或 整数的右移不是算术移位或 无符号类型中的值位数不是对应的有符号类型+ 1或中的值位数 从较宽的int类型转换为较小的类型不是通过截断不适合的最左边的位 编辑:或者,如果在1995年至1998年期间有平台影响C99决定包括上述内容,但已经停止,我也会对它们感兴趣。 编辑:C理由有关填充位的说法: 填充位是用户可访问的无符号整数类型。 例如,假设一台机器使用一对16位短路(每个都有自己的符号位)来构成一个32位的int,并且当在这个32位int中使用时,忽略较低short的符号位。 然后,作为32位有符号整数,在确定32位有符号int的值时会忽略一个填充位(在32位的中间)。 但是,如果将此32位项目视为32位无符号整数,则该填充位对用户程序可见。 C委员会被告知有一台机器以这种方式工作,这就是填充位被添加到C99的一个原因。 脚注44和45提到奇偶校验位可能是填充位。 委员会不知道任何具有用户可访问的奇偶校验位的机器在整数内。 因此,委员会不知道任何将奇偶校验位视为填充位的机器。 所以另一个问题是,C99提到的那台机器是什么? 编辑:似乎C99正在考虑取消对1的补码和签名幅度的支持: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n868.htm http://www.open- std.org/jtc1/sc22/wg14/www/docs/n873.htm (搜索6.2.6.2)

C:标准和编译器中的整数溢出

由Carl Norum编辑,包括适当的标准参考。 C标准规定 如果在计算表达式期间发生exception情况 (即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。 是否有编译器开关可以保证整数溢出时的某些行为? 我想避免鼻腔恶魔。 特别是,我想强制编译器包装溢出。 为了唯一性,让标准为C99,编译器为gcc。 但我会对其他编译器(icc,cl)和其他标准(C1x,C89)的答案感兴趣。 事实上,为了惹恼C / C ++人群,我甚至欣赏C ++ 0x,C ++ 03和C ++ 98的答案。 注:国际标准ISO / IEC 10967-1可能与此相关,但据我所知,仅在资料性附录中提及。

mingW中的标准C库

我已经安装了mingW来使用gcc,平台windows 7.我试图找到mingW文件夹中的标准C库libc.a。 没有运气..是否以其他名称存储?

如果他们定义了标准的ABI,C / C ++会“丢失”什么?

标题说明了一切。 我特别谈论C / C ++,因为他们都认为这是“实施问题”。 我认为,定义标准接口可以轻松构建模块系统,以及许多其他好东西。 如果他们定义了标准的ABI,C / C ++会“丢失”什么?

对多维数组的一维访问:它是明确定义的行为吗?

我想我们都同意,通过以一维方式解引用(可能是偏移的)指向其第一个元素的指针来访问真正的多维数组被认为是惯用的C,例如: void clearBottomRightElement(int *array, int M, int N) { array[M*N-1] = 0; // Pretend the array is one-dimensional } int mtx[5][3]; … clearBottomRightElement(&mtx[0][0], 5, 3); 然而,我的语言律师需要说服这实际上是明确定义的C! 特别是: 标准是否保证编译器不会在例如mtx[0][2]和mtx[1][0]之间插入填充? 通常,索引关闭数组的末尾(除了结尾之外)是未定义的(C99,6.5.6 / 8)。 所以以下内容显然未定义: struct { int row[3]; // The object in question is an int[3] int other[10]; } foo; int *p = &foo.row[7]; // ERROR: A […]

宣布主要原型

有什么理由我从未在C程序中看到main的原型声明,即: int main(int argc, char* argv[]); int main(int argc, char* argv[]) { return 0; } 似乎总是不一致..

没有定义类型的函数参数默认为int? 我疯了吗?

由于一些奇怪的原因,我正在复制另一种不使用类型的语言的例子,并且忘了在函数定义参数中添加一个,并且它有效。 #include char toChar(n) { //sizeof n is 4 on my 32 bit system const char *alpha = “0123456789ABCDEF”; return alpha[n]; } int main() { putchar(toChar(15)); //ie return 0; } 我确信某些标准的大多数编译器的main默认为int(但只返回),对于其他函数,这也是一种行为,或者这个实现是否定义了? 这似乎与众不同,我的编译器只是一个稍微过时的GCC端口(MinGW)。