Tag: unsigned

为什么比较一个无符号的Int> = 0一个“无意义的比较”?

我收到警告: Pe186“无符号int与零的无意义比较” 当我尝试编译以下代码时: for(clLoop = cpLoopStart; clLoop >= 0; clLoop–) { //Do something } 我不明白为什么。 我能理解,如果我正在寻找一个小于零的值,因为unsigned int永远不会是负数。 但我在这里寻找的是它是否等于零, unsigned int当然可以。 我甚至可以看到这个错误,如果在这个循环中我试图预先减少而不是后减量,但是情况并非如此。

从unsigned long int转换为signed int,反之亦然

我想将一个signed int传递给gsl_rng_uniform_int (const gsl_rng * r, unsigned long int n) 。 我传递的signed int大于或等于零。 该函数将返回一个介于0和n之间的数字,因此如果我传递一个正的signed int,它将返回一个在signed int范围内的数字。 然后我想将返回值存储在signed int中。 用明显的预期行为来做到这一点最简洁的方法是什么? 我在64位Linux机器上使用64位编译器。 更新抱歉,伙计们。 请忽略。 我的代码问题其实在其他地方。 我误解了gdb的输出。

UINT_MAX与C中的ULONG_MAX相同

在解决K&R C书中的练习时,我偶然发现了练习2.1。 起初我把UINT_MAX作为-1 ,但后来我使用了%u占位符,但现在它给了我与ULONG_MAX相同的数字。 在附录B的书中,他们说UINT_MAX应该是65535而ULONG_MAX应该是4294967295 ,但是在运行练习时,它给我的UINT_MAX和ULONG_MAX都是4294967295 。 这是为什么?

为什么短*而不是char *为字符串? char *和unsigned char *之间的区别?

正如标题所说,我有两个问题。 编辑 :为了澄清,他们实际上并没有使用char和short ,他们确保它们是特定typedef的8位和16位。 然后将实际类型称为UInt8和UInt16 。 1.问题 iTunes SDK使用unsigned short* ,需要字符串 。 使用它而不是char* / unsigned char*什么好处? 如何将其转换为char* ,以及使用此类型时有何不同? 2.问题 我只看到char*当时必须存储一个字符串。 我什么时候应该使用unsigned char* ,或者它没有任何区别?

在C / C ++中定义类型化常量数

在C / C ++中,说(1U)与((unsigned int)1)之间有区别吗? 我更喜欢第二个,但我担心第二个可能在运行时进行类型转换(即额外的cpu周期),而第一个在编译时获得正确的类型。 谢谢。

C中unsigned int的行为

C中无符号整数的大小为0 to 65,535 or 0 to 4,294,967,295 。 我在C中测试了以下代码: unsigned int number = 0; number -= 300; printf(“%d\n”, number); 输出:-300 我记得如果unsigned int变量的值低于0,它应该回绕并且我期望输出类似于4294966996 。 但是从控制台打印的输出是-300 。 我在C ++中测试了类似的语句,它确实给了我4294966996 。 我的问题是:为什么输出-300尽管它是一个unsigned int ? PS:我查看过几个标题相似的post,但他们没有解决同样的问题: 在C中签名vs unsigned int 无符号整数差异的意外结果

为什么“for(i = 100; i <= 0; –i)”永远循环?

unsigned int i; for (i = 100; i <= 0; –i) printf("%d\n",i);

通过Emscripten在Javascript中进行结构化操作

我在使用C和Javascript之间的emscripten互操作方面遇到了很多问题。 更具体地说,我无法访问在javascript中使用C创建的结构,因为指向结构的指针作为外部库传递给javascript。 看一下下面的代码: C: #include #include #include struct test_st; extern void read_struct(struct test_st *mys, int siz); struct test_st{ uint32_t my_number; uint8_t my_char_array[32]; }; int main(){ struct test_st *teststr = malloc(sizeof(struct test_st)); teststr->my_number = 500; for(int i = 0; i my_char_array[i] = 120 + i; } for(int i = 0; i my_char_array[i]); } read_struct(teststr,sizeof(teststr)); return 0; […]

C中的无符号溢出

考虑以下C代码: #include uint32_t inc(uint16_t x) { return x+1; } 当使用gcc-4.4.3在纯x86_64系统上使用标志-std = c99 -march = core2 -msse4.1 -O2 -pipe -Wall进行编译时,它会生成 movzwl %di,%eax inc %eax retq 现在,在C中预测无符号溢出。我不太了解x86_64汇编,但据我所知,16位参数寄存器被移动到32位寄存器,该寄存器递增并返回。 我的问题是,如果x == UINT16_MAX怎么办。 会发生溢出,标准规定x + 1 == 0,对吗? 但是,如果%eax是一个32位寄存器,它现在包含UINT16_MAX + 1,这是不正确的。 这让我在这里连接一个问题:是否有一种可移植的方法来禁用C中的无符号溢出,这样编译器就可以假设存储在大寄存器中的小变量的高位始终为0(所以它不需要清除它们)? 如果不是(或者如果解决方案在语法上是令人讨厌的),至少在GCC中有没有办法做到这一点? 非常感谢您的宝贵时间。

对于使用无符号整数时循环条件停止在0?

我有一个必须从N到0(包括)的循环。 我的i变量的类型为size_t ,通常是无符号的。 我目前正在使用以下代码: for (size_t i = N; i != (size_t) -1; –i) { … } 那是对的吗? 有没有更好的方法来处理这种情况? 谢谢, 文森特。