Tag: c99

矩阵乘法与块

这是我加速矩阵乘法的代码,但它比简单乘法快5%。 我能做些什么来尽可能地提升它? *正在访问这些表格,例如: C [i,j,n]]用于C [i,j]位置。 void matrixMultFast(float * const C, /* output matrix */ float const * const A, /* first matrix */ float const * const B, /* second matrix */ int const n, /* number of rows/cols */ int const ib, /* size of i block */ int const jb, /* size […]

在stdint.h中定义的C99签名整数类型是否在溢出的情况下表现出良好定义的行为?

对于C(short,int,long等)中的“标准”有符号整数类型的所有操作,如果它们产生超出[TYPE_MIN,TYPE_MAX]间隔的结果(其中TYPE_MIN,TYPE_MAX是最小值和最大整数值),则表现出未定义的行为可以通过特定整数类型存储的。 但是,根据C99标准,所有intN_t类型都需要具有二进制补码表示: 7.8.11.1精确宽度整数类型 1. typedef名称intN_t指定有符号整数类型,其宽度为N,没有填充位和二进制补码表示。 因此,int8_t表示宽度恰好为8位的有符号整数类型。 这是否意味着C99中的intN_t类型在整数溢出的情况下表现出良好定义的行为? 例如,这段代码定义明确吗? #include #include #include int main(void) { printf(“Minimum 32-bit representable number: %” PRId32 “\n”, INT32_MAX + 1); return 0; }

GCC __attribute __((模式(XX))实际上做了什么?

这源于今天早些时候关于bignum库和gcc特定的C语言攻击主题的问题。 具体来说,使用了这两个声明: typedef unsigned int dword_t __attribute__((mode(DI))); 在32位系统和 typedef unsigned int dword_t __attribute__((mode(TI))); 在64位系统上。 我假设这是对C语言的扩展,没有办法实现它在当前(C99)标准中实现的任何目标。 所以我的问题很简单:这个假设是否正确? 这些陈述对底层内存有何影响? 我认为结果是我在32位系统中使用2*sizeof(uint32_t) ,在64位系统中使用2*sizeof(uint64_t) ,我是否正确?

GCC:严格别名警告的准确性

我正在尝试检查我的一些代码是否存在严格的别名违规,但在尝试理解严格的别名规则时,我似乎错过了一些东西。 想象一下以下代码: #include int main( void ) { unsigned long l; l = 0; *( ( unsigned short * )&l ) = 1; printf( “%lu\n”, l ); return 0; } 经典和基本的例子。 使用GCC 4.9( -Wall -fstrict-aliasing -Wstrict-aliasing -O3 ),它实际报告错误: dereferencing type-punned pointer will break strict-aliasing rules 但以下编译很好: #include int main( void ) { unsigned long l; […]

C99有#define吗?

我想用C99做一些事情,否则以另一种方式执行。 要检查的#define是什么? #ifdef C99 … #else … #endif

为什么在设置-std = c99时gcc不能找到random()接口?

我在源代码的顶部做”#include ” 。 示例编译: /usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c In file included from f8.c:7: ctype-cmp.c: In function ‘randomized’: ctype-cmp.c:48: warning: implicit declaration of function ‘random’ ctype-cmp.c: In function ‘main’: ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’ ais@xcalibur:t$ 当我关闭-std = c99时,无法找到函数isfinite()。 所以我确实想要使用-std = c99这个和其他原因。 有什么技巧我不见了?

为什么不是新的(特定于位宽)printf()格式选项字符串作为C99的一部分?

在研究如何在C中执行跨平台printf()格式字符串时(也就是考虑到我希望每个整数参数对printf()的位数应该是)我在printf()上浏览维基百科文章的这一部分printf() 。 本文讨论了可以传递给printf()格式字符串的非标准选项,例如(似乎是特定于Microsoft的扩展名): printf(“%I32d\n”, my32bitInt); 它接着说: ISO C99包括inttypes.h头文件,其中包含许多用于独立于平台的printf编码的宏。 …然后列出一组可在所述标题中找到的宏。 查看头文件,使用它们我必须写: printf(“%”PRId32″\n”, my32bitInt); 我的问题是:我错过了什么吗? 这真的是标准的C99方式吗? 如果是这样,为什么? (虽然我从未见过以这种方式使用格式字符串的代码并不感到惊讶,因为它看起来很麻烦……)

如何在C99模式下编译C项目?

编译C代码时收到以下错误消息: error: ‘for’ loop initial declarations are only allowed in C99 mode note: use option -std=c99 or -std=gnu99 to compile your code 这是什么意思? 怎么解决?

枚举对象设置为不等于其各自枚举常量的值

如果将枚举对象设置为不等于其各自枚举常量的值,则枚举对象具有什么值? 请考虑以下代码: enum foobar{ FOO = 1, BAR = 5 }; enum foobar baz = 5; enum foobar qux = 42; 变量baz被设置为整数值5 ,而变量qux被设置为整数值42 。 我怀疑变量baz将保持值BAR ,但我不确定变量qux 。 没有为枚举常量赋值42 ,那么当enum foobar变量设置为这样的值时会发生什么? C99标准是否明确了结果?

unsigned char总是被提升为int吗?

假设如下: unsigned char foo = 3; unsigned char bar = 5; unsigned int shmoo = foo + bar; 是否保证将foo和bar值提升为用于表达式foo + bar的求值的int值 – 或者是否允许实现将它们提升为unsigned int ? 在第6.2.5节第8段中: 对于具有相同签名和不同整数转换等级的任何两个整数类型(参见6.3.1.1),具有较小整数转换等级的类型的值范围是另一种类型的值的子范围。 在第6.2.5节第9段中: 如果int可以表示原始类型的所有值,则该值将转换为int ; 否则,它将转换为unsigned int 。 保证具有较小整数转换等级的整数类型具有作为另一类型的值的子范围的值的范围似乎取决于整数类型的有符号性。 signed char对应于signed int unsigned char对应unsigned int 这是否意味着unsigned char值只能保证在unsigned int的子范围内,而不一定是int ? 如果是这样,那是否意味着实现理论上可以有一个unsigned char值,它不在int的子范围内?