Tag: unsigned

正确初始化无符号字符的方法*

初始化unsigned char*的正确方法是什么? 我目前正在这样做: unsigned char* tempBuffer; tempBuffer = “”; 或者我应该使用memset(tempBuffer, 0, sizeof(tempBuffer)); ?

计算带有前导零的数字总和时C中的奇怪行为

我只想在C中编写一个简约程序来计算某个自然数的位数之和(数字之和定义如下:sumOfDigits(123)= 6,sumOfDigits(0)= 0,sumOfDigits(32013)= 9 , 等等)。 到目前为止,使用以下代码片段一切正常。 例如,对于5100,它正确地提供6。 但是,为什么14为05100交付(记得领先的0)? 这里发生了什么? 我查看了数字的二进制表示,但这并没有给我任何信息。 (顺便说一下:我想,下面的代码应该在任何地方运行。) #include unsigned int sumOfDigits(unsigned int n) { int retval = 0; while (n > 0) { retval += n % 10; n/=10; } return retval; } int main() { printf(“OK: %u\n”, sumOfDigits(5100u)); printf(“WTF: %u”, sumOfDigits(05100u)); return 0; } 编辑:正如Zaibis所说……领先的0表示八进制表示法。 :-)所以:5100_8 == 2624_10

C:gcc中的uint16_t减法行为

我试图减去两个无符号整数并将结果与​​有符号整数(或文字)进行比较。 使用unsigned int类型时,行为符合预期。 当使用uint16_t (来自stdint.h )类型时,行为不是我所期望的。 使用gcc 4.5进行比较。 给出以下代码: unsigned int a; unsigned int b; a = 5; b = 20; printf(“%u\n”, (ab) < 10); 输出为0,这是我的预期。 a和b都是无符号的,并且b大于a,因此结果是一个大的无符号数,大于10.现在如果我改变a和b来输入uint16_t: uint16_t a; uint16_t b; a = 5; b = 20; printf(“%u\n”, (ab) < 10); 输出为1.这是为什么? 两个uint16_t类型之间的减法结果是存储在gcc中的int中吗? 如果我将10更改为10U则输出再次为0,这似乎支持这一点(如果减法结果存储为int并且与无符号int进行比较,则减法结果将转换为unsigned int)。

C / C ++使用int或unsigned int

在很多代码示例,源代码,库等中我看到使用int时,就我所知,unsigned int会更有意义。 我看到的一个地方很多是for循环。 见下面的例子: for(int i = 0; i < length; i++) { // Do Stuff } 为什么你会使用int而不是unsigned int? 这只是懒惰吗 – 人们不会因打字unsigned而烦恼吗?

为了将签名文字分配给无符号类型,为什么GCC不会产生警告?

本网站上的几个问题揭示了混合有符号和无符号类型时的缺陷,大多数编译器似乎都很好地生成了这种类型的警告。 但是,在为无符号类型指定有符号常量时,GCC似乎并不在意! 考虑以下程序: /* foo.c */ #include int main(void) { unsigned int x=20, y=-30; if (x > y) { printf(“%d > %d\n”, x, y); } else { printf(“%d <= %d\n", x, y); } return 0; } 使用GCC 4.2.1进行编译如下所示在控制台上没有输出: gcc -Werror -Wall -Wextra -pedantic foo.c -o foo 生成的可执行文件生成以下输出: $ ./foo 20 <= -30 当将有符号值-30分配给无符号整数变量y时,是否有某些原因导致GCC不生成任何警告或错误消息?

测试最大无符号值

这是在C和C ++代码中测试最大无符号值的正确方法: if(foo == -1) { // at max possible value } 其中foo是unsigned int , unsigned short ,依此类推。

wchar_t只是unsigned short的typedef吗?

例如,确实: wchar_t x; 翻译成: unsigned short x;

C中的无符号值

我有以下代码: #include int main() { unsigned int a = -1; int b = -1; printf(“%x\n”, a); printf(“%x\n”, b); printf(“%d\n”, a); printf(“%d\n”, b); printf(“%u\n”, a); printf(“%u\n”, b); return 0; } 输出是: ffffffff ffffffff -1 -1 4294967295 4294967295 我可以看到根据传递给printf函数的值将值解释为有符号或无符号。 在这两种情况下,字节都是相同的( ffffffff )。 那么, unsigned单词是什么?

如果我们在C / C ++中添加安全签名/无符号比较,它会破坏语言或现有代码吗?

在阅读了有关签名/未签名比较的问题之后(他们每隔几天我会说出来): 签名/未签名比较和-Wall 我想知道为什么我们没有正确的签名无符号比较,而是这个可怕的混乱? 从这个小程序中获取输出: #include #define C(T1,T2)\ {signed T1 a=-1;\ unsigned T2 b=1;\ printf(“(signed %5s)%d < (unsigned %5s)%d = %d\n",#T1,(int)a,#T2,(int)b,(a<b));}\ #define C1(T) printf("%s:%d\n",#T,(int)sizeof(T)); C(T,char);C(T,short);C(T,int);C(T,long); int main() { C1(char); C1(short); C1(int); C1(long); } 用我的标准编译器(gcc,64bit)编译,我得到这个: char:1 (signed char)-1 < (unsigned char)1 = 1 (signed char)-1 < (unsigned short)1 = 1 (signed char)-1 < (unsigned int)1 = 0 […]

signed和unsigned int之间的强制转换是否在内存中保持变量的精确位模式?

我想通过套接字传递一个32位有符号整数x 。 为了让接收器知道期望哪个字节顺序,我在发送之前调用htonl(x) 。 虽然htonl需要一个uint32_t但我想确定当我将int32_t转换为uint32_t时会发生什么。 int32_t x = something; uint32_t u = (uint32_t) x; 总是这样的情况, x和u中的字节将完全相同吗? 怎么回事: uint32_t u = something; int32_t x = (int32_t) u; 我意识到负值会转换为大的无符号值,但这并不重要,因为我只是回到了另一端。 但是如果使用实际字节进行混乱,那么我无法确定返回将返回相同的值。