小编tyt*_*yty的帖子

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 standards

24
推荐指数
5
解决办法
751
查看次数

C标准涵盖的平台是否仍在使用?

可能重复:重新说明
:C标准支持的平台列表

C标准定义非常松散: - 它涵盖了两个补码,一个补码,有符号幅度 - 整数可以是各种宽度,带填充位 - 某些位模式可能不代表有效值.

这有一个明显的缺点:它使便携式代码更难写.有没有人知道仍然有积极的开发工作的平台,但是

  • 不是2的补充或
  • 整数宽度不是32位或64位或
  • 某些整数类型有填充位或
  • 如果您使用2的补码机器,符号位1和所有值位0的位模式不是有效的负数或
  • 从有符号到无符号的整数转换(反之亦然)不是通过逐字复制位模式或
  • 整数的右移不是算术移位或
  • 无符号类型中的值位数不是相应有符号类型+ 1或中的值位数
  • 从较宽的int类型转换为较小的类型不是通过截断不适合的最左边的位

c standards

18
推荐指数
1
解决办法
337
查看次数

复杂的javascript条件表达式

解释这个复杂的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 ? …

javascript conditional expression

9
推荐指数
1
解决办法
574
查看次数

负零的C标准(1的补码和有符号的幅度)

所有这些功能都可以在我的机器上获得预期的结果.他们都在其他平台上工作吗?

更具体地说,如果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 standards bit-shift zero negative-number

7
推荐指数
1
解决办法
1668
查看次数

C:查找算术表达式类型的最大值和最小值

我需要找到没有副作用的任意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)

c types expression max min

6
推荐指数
1
解决办法
349
查看次数

C检查签名号码表示

以下检查签名号码表示的方法在我的机器上正确检查二进制补码,但是我没有补码或签名幅度机器来检查它.代码是否正常工作,更重要的是,它是否可移植?

文件: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 platform representation negative-number

4
推荐指数
1
解决办法
333
查看次数

C:确认简单的算术输出

我可以确认以下C代码为b提供了未定义的结果:

unsigned a = 0;
int b = a - 1;
Run Code Online (Sandbox Code Playgroud)

c math int unsigned undefined

3
推荐指数
1
解决办法
84
查看次数