Tag: 无符号

unsigned在if语句比较中签名?

我在这个网站上搜索了一个答案,发现很多对未签名/签名比较的回复,但是这个问题是只比较了无符号参数,但它仍然很有趣。 以下代码的问题是第一个if -statment不会发生(“hello”),而第二个(“world”)就是这样。 我已经解释为在if -statment内部进行的计算会生成一个负数,但是保存到变量的结果完全相同的计算不会(即使结果被保存到有符号变量)。 使用的编译器是gcc 4.4。 unsigned short u16_varHigh; unsigned short u16_varLow; unsigned short u16_Res1; signed short s16_Res1; u16_varHigh = 0xFFFF; u16_varLow = 10; u16_Res1 = u16_varLow – u16_varHigh; // response is 11 as expected s16_Res1 = u16_varLow – u16_varHigh; // response is 11 as expected // Does not enter if( (u16_varLow – u16_varHigh) […]

无法摆脱“此十进制常量仅在ISO C90中无符号”警告

我在我的哈希表实现上使用FNV哈希作为哈希算法,但我在这行的问题标题中收到警告: unsigned hash = 2166136261; 我不明白为什么会这样,因为当我这样做时: printf(“%u\n”, UINT_MAX); printf(“2166136261\n”); 我明白了: 4294967295 2166136261 这似乎是在我的机器的限制下…… 为什么我会收到警告,有什么方法可以摆脱它?

算术运算期间的数据类型提升:-1 <(unsinged int)1 == false

main() { if ( -1 < (unsigned char) 1 ) printf("less than"); else printf("NOT less than"); } 打印less than 。 因为, (unsigned char) 1 被转换为 (signed char) 1然后:( (signed) -1 < (signed) 1 ,因此输出less than 。 但是,如果我将上面的代码更改为if ( (-1 < (unsigned int) 1 ) 然后输出NOT less than 。 所以很明显,当我将unsigned char更改为unsigned int时: (signed)-1转换为unsigned int [正好相反] 因为-1被存储为2的恭维1; […]

使用unsigned long类型进行位移会产生错误的结果

我有点困惑,因为我想在我的系统上初始化一个unsigned long类型的变量,其大小为8个字节(在我认为的每个现代系统上)。 当我想为变量分配1 << 63 ,我得到一个编译器警告但是数字实际上是0.当我做1 << 30我得到预期的结果2 ^ 30 = 1073741824 。 然而,当我做1 << 31 ,我得到2 ^ 64的结果(我认为;实际上这不应该是可能的),它打印18446744071562067968 。 任何人都可以向我解释这种行为吗?