标签: c99

为什么C/C99标准的作者没有为sizeof浮点类型指定..standard?

我注意到在windows和linux x86上,float是4bytes,double是8,但long xins分别是x86和x86_64上的12和16.C99应该用特定的整体尺寸打破这种障碍.

最初的技术限制似乎是由于x86处理器无法处理超过80位的浮点运算(加上2个字节来进行舍入),但为什么标准与int类型相比不一致?他们为什么不至少达到80bit标准化?

c programming-languages c99

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

在C99中右移">>"

可能重复:
右移操作员的奇怪行为

你好

为什么这个函数的两个数字都打印相同?它不是循环移位.

unsigned int i=0x89878685;
int main()
{
  printf("0x%x\n", i);
  printf("0x%x\n", i>>32);
}

$ ./a.out
0x89878685
0x89878685
Run Code Online (Sandbox Code Playgroud)

所有编译器都以这种方式工作吗?

c c99 bit-shift shift

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

std :: remquo目的和用法?

这个std::remquo功能的目的是什么?什么时候使用它而不是常规std::remainder函数?

c c++ floating-point c99 c++11

3
推荐指数
2
解决办法
390
查看次数

在C中未签名的签名转换

是否保证以下工作或实施定义?

unsigned int a = 4294967294;
signed int b = a;
Run Code Online (Sandbox Code Playgroud)

b-2在gcc上.

来自C99(§6.3.1.3/ 3)否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.

c c99

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

澄清整数常量表达式

在某处我读过整数常量表达式包含整数常量,例如:

(5 + 5) //integer constant expression
Run Code Online (Sandbox Code Playgroud)

这是我见过的唯一例子.

现在,从标准说:

(C99 6.6/6)整数常量表达式应具有整数类型,并且只能具有整数常量的操作数,枚举常量,字符常量,结果为整数常量的sizeof表达式,以及作为强制转换的直接操作数的浮点常量.整数常量表达式中的转换运算符只能将算术类型转换为整数类型,除非作为sizeof运算符的操作数的一部分.

那么,如果我是对的,下面是所有这些整数表达式吗?

int i; float f = 3.14f;

i = 42;
i = f;
i = (int)(5/3.14f);
Run Code Online (Sandbox Code Playgroud)

c c99

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

有效地将16位短路转换为8位短路

我正在研究一个没有硬件分区的Cortex M0 cpu,所以每次分割一些东西时,都会使用GCC库函数.现在,我做的最多的除法之一就是除以256,将短路转换为字节.有没有什么方法可以比默认的GCC库更有效地(比如通过位移)做到这一点?

c embedded gcc c99 integer-division

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

如何计算有符号位字段的最大支持值?

假设我的项目包含来自第三方库的标题,其中包含:

struct foo {
    signed int x:4;
};
Run Code Online (Sandbox Code Playgroud)

如果不假设位字段总是具有宽度4,并且不依赖于实现定义的行为,那么如何确定可以存储在成员中的最大值x

c c99 bit-fields c11

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

如何使用Math.h中的M_LN2

我试图使用math.h库中的常量M_LN2,但似乎总是遇到编译器错误.代码是:

#include <stdio.h>
#include <math.h>

int main(){

double x = M_LN2;
printf("%e",x);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

在ubuntu上用gcc编译

gcc -std=c99 lntester.c -o lntester -lm
Run Code Online (Sandbox Code Playgroud)

获得输出:

error: 'M_LN2' undeclared 
Run Code Online (Sandbox Code Playgroud)

任何帮助理解为什么会发生这种情况将不胜感激.

如下所述,if def未定义,使用gcc和c99导致问题.下面是解决问题的编译代码,允许我使用c99.

gcc -std=c99 -D_GNU_SOURCE lntested.c -o lntester -lm
Run Code Online (Sandbox Code Playgroud)

c constants c99 math.h

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

C99是否允许标识符中的通用字符名称?

根据C99规范WG14/N1124草案§6.4.2,"标识符":

identifier:  
       identifier-nondigit  
       identifier identifier-nondigit  
       identifier digit

identifier-nondigit:  
       nondigit  
       universal-character-name  
       other implementation-defined characters
Run Code Online (Sandbox Code Playgroud)

§6.4.3,"通用字符名称":

universal-character-name:
       \u hex-quad
       \U hex-quad hex-quad
Run Code Online (Sandbox Code Playgroud)

这似乎表明类似的标识符foo\u00AAbar根据语法是有效的.我在语义上找不到任何暗示的东西.然而GCC拒绝这样的标识符,甚至没有尝试解析它:

<stdin>:2: error: stray ‘\’ in program
<stdin>:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘u00AAbar’
<stdin>:2: error: ‘u00AAbar’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

这是对GCC,C99标准或我的推理的疏忽吗?

c c99 language-lawyer

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

是否存在允许不区分大小写的C编译器标志?

我只是想知道,是否有可能指示GCC(或其他编译器)我不想在我的C代码中区分大小写?

如果那是不可能的,那么另一个选择是让一个编译器标志在找到两个具有相同名称和不同外壳的全局变量/函数时抛出错误.

c programming-languages c99 compiler-specific

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