有没有人知道C标准支持的任何平台,对于这些平台仍然有积极的开发工作,但它们是:
编辑:或者,如果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标准支持的平台列表
C标准定义非常松散: - 它涵盖了两个补码,一个补码,有符号幅度 - 整数可以是各种宽度,带填充位 - 某些位模式可能不代表有效值.
这有一个明显的缺点:它使便携式代码更难写.有没有人知道仍然有积极的开发工作的平台,但是
解释这个复杂的javascript表达式的正确方法是什么?
some_condition ? a = b : c = d = e;
遵循运算符优先级规则,我希望它是:
(some_condition ? a = b : c) = d = e;
但似乎分组实际上是:
编辑:(原始分组不清楚.请参阅下面的更新)
编辑: some_condition ? a = b : (c = d = e);
为什么会这样?(而且我没有写那段代码)
编辑:这似乎表明,在Javascript中说?:具有更高的优先级而=不是完全正确.作为进一步的例子:
x = y ? a = b : c = d = e;
如果?:优先级高于=(如在C中)那么分组将是
x = ((y ? a = b : c) = (d = e));
而是(从答案中)我们拥有的是什么
x = (y ? …
所有这些功能都可以在我的机器上获得预期的结果.他们都在其他平台上工作吗?
更具体地说,如果x在1的补码机器上具有位表示0xffffffff或在有符号的幅度机器上具有0x80000000,那么标准对于(无符号)x的表示有何看法?
另外,我认为v2,v2a,v3,v4中的(unsigned)转换是多余的.它是否正确?
假设sizeof(int)= 4且CHAR_BIT = 8
int logicalrightshift_v1 (int x, int n) {
return (unsigned)x >> n;
}
int logicalrightshift_v2 (int x, int n) {
int msb = 0x4000000 << 1;
return ((x & 0x7fffffff) >> n) | (x & msb ? (unsigned)0x80000000 >> n : 0);
}
int logicalrightshift_v2a (int x, int n) {
return ((x & 0x7fffffff) >> n) | (x & (unsigned)0x80000000 ? (unsigned)0x80000000 >> n : 0);
}
int logicalrightshift_v3 (int x, int n) { …Run Code Online (Sandbox Code Playgroud) 我需要找到没有副作用的任意C表达式的最大值和最小值.以下宏可以在我的机器上运行.他们会在所有平台上工作吗?如果没有,他们可以修改工作吗?我的意图是随后使用这些来实现SAFE_MUL(a,b)代替的宏a*b.SAFE_MUL将包括检查乘法溢出.
编辑:按史蒂夫的建议投射类型.
#include <stdio.h>
#include <limits.h>
#define IS_SIGNED(exp) (((exp)*0-1) < 0)
#define TYPE_MAX_UNSIGNED(exp) ((exp)*0-1)
#define TYPE_MAX_SIGNED(exp) ( \
sizeof (exp) == sizeof (int) \
? \
INT_MAX \
: \
( \
sizeof (exp) == sizeof (long) \
? \
LONG_MAX \
: \
LLONG_MAX \
) \
)
#define TYPE_MAX(exp) ((unsigned long long)( \
IS_SIGNED (exp) \
? \
TYPE_MAX_SIGNED (exp) \
: \
TYPE_MAX_UNSIGNED (exp) \
))
#define TYPE_MIN_SIGNED(exp) ( \
sizeof …Run Code Online (Sandbox Code Playgroud) 以下检查签名号码表示的方法在我的机器上正确检查二进制补码,但是我没有补码或签名幅度机器来检查它.代码是否正常工作,更重要的是,它是否可移植?
文件:platform.h
#ifndef PLATFORM_H
#define PLATFORM_H
#include <limits.h>
static
const union {
signed char sc;
unsigned char uc;
} plat_4xvYw = {.sc = -1};
#define IS_TWOS_COMPL (plat_4xvYw.uc == UCHAR_MAX)
#define IS_ONES_COMPL (plat_4xvYw.uc == UCHAR_MAX - 1)
#define IS_SIGNED_MAG (plat_4xvYw.uc == (1U << (CHAR_BIT - 1)) + 1U)
#endif
Run Code Online (Sandbox Code Playgroud)
档案:ac
#include <inttypes.h>
#include <limits.h>
#include "platform.h"
#include <assert.h>
int
main (void) {
assert (IS_TWOS_COMPL);
if (IS_TWOS_COMPL) {
printf ("twos complement\n");
} else if (IS_ONES_COMPL) {
printf ("ones complement\n");
} else if …Run Code Online (Sandbox Code Playgroud) c ×6
standards ×3
expression ×2
bit-shift ×1
conditional ×1
int ×1
javascript ×1
math ×1
max ×1
min ×1
platform ×1
types ×1
undefined ×1
unsigned ×1
zero ×1