我注意到在windows和linux x86上,float是4bytes,double是8,但long xins分别是x86和x86_64上的12和16.C99应该用特定的整体尺寸打破这种障碍.
最初的技术限制似乎是由于x86处理器无法处理超过80位的浮点运算(加上2个字节来进行舍入),但为什么标准与int类型相比不一致?他们为什么不至少达到80bit标准化?
可能重复:
右移操作员的奇怪行为
你好
为什么这个函数的两个数字都打印相同?它不是循环移位.
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)
所有编译器都以这种方式工作吗?
这个std::remquo功能的目的是什么?什么时候使用它而不是常规std::remainder函数?
是否保证以下工作或实施定义?
unsigned int a = 4294967294;
signed int b = a;
Run Code Online (Sandbox Code Playgroud)
值b是-2在gcc上.
来自C99(§6.3.1.3/ 3)否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.
在某处我读过整数常量表达式包含整数常量,例如:
(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) 我正在研究一个没有硬件分区的Cortex M0 cpu,所以每次分割一些东西时,都会使用GCC库函数.现在,我做的最多的除法之一就是除以256,将短路转换为字节.有没有什么方法可以比默认的GCC库更有效地(比如通过位移)做到这一点?
假设我的项目包含来自第三方库的标题,其中包含:
struct foo {
signed int x:4;
};
Run Code Online (Sandbox Code Playgroud)
如果不假设位字段总是具有宽度4,并且不依赖于实现定义的行为,那么如何确定可以存储在成员中的最大值x?
我试图使用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) 根据C99规范WG14/N1124草案§6.4.2,"标识符":
Run Code Online (Sandbox Code Playgroud)identifier: identifier-nondigit identifier identifier-nondigit identifier digit identifier-nondigit: nondigit universal-character-name other implementation-defined characters
§6.4.3,"通用字符名称":
Run Code Online (Sandbox Code Playgroud)universal-character-name: \u hex-quad \U hex-quad hex-quad
这似乎表明类似的标识符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标准或我的推理的疏忽吗?
我只是想知道,是否有可能指示GCC(或其他编译器)我不想在我的C代码中区分大小写?
如果那是不可能的,那么另一个选择是让一个编译器标志在找到两个具有相同名称和不同外壳的全局变量/函数时抛出错误.