相关疑难解决方法(0)

if语句中的sizeof()运算符

#include <stdio.h>
int main(void)
{
    if (sizeof(int) > -1)
        printf("True");
    else
        printf("False");
}
Run Code Online (Sandbox Code Playgroud)

它打印False.为什么sizeof()不返回值if

c sizeof

39
推荐指数
3
解决办法
4135
查看次数

C中的可变促销

我在解决为什么输出在每种特定情况下都不同时遇到了问题.在示例代码a中,有一个我期望的变量提升和结果> 6,但在示例代码b中,结果是<= 6:

/* **Code a** */
puts("Code a\n");
unsigned int a = 6;
int b = -20;
( a+b > 6) ? puts("> 6\n") : puts("<= 6\n");

/* **Code b** */
puts("Code b:\n");
uint8_t a1 = 6;
int8_t  b1 = -20;  
( a1+b1 > 6) ? puts("> 6\n") : puts("<= 6\n");
Run Code Online (Sandbox Code Playgroud)

输出:

Code a

> 6

Code b:

<= 6
Run Code Online (Sandbox Code Playgroud)

c integer-promotion

16
推荐指数
1
解决办法
928
查看次数

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) > (unsigned short)5 )  
{  
 printf( "hello" );  
}

// Does enter  
if( (unsigned short)(u16_varLow - u16_varHigh) > 5 )  
{  
 printf( "world" …
Run Code Online (Sandbox Code Playgroud)

c comparison unsigned if-statement

8
推荐指数
1
解决办法
2706
查看次数

乘以无符号字符时溢出?

当我在C中乘以两个无符号字符时,如下所示:

unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;
Run Code Online (Sandbox Code Playgroud)

然后我知道我会溢出,因此我得到(40'000模256).当我这样做:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = (int)a * (int)b;
Run Code Online (Sandbox Code Playgroud)

我会得到正确的结果40'000.但是,我不知道这会发生什么:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = a * b;
Run Code Online (Sandbox Code Playgroud)

我可以确定正确的事情发生了吗?这个编译器是否依赖?同样,我不知道做减法时会发生什么:

unsigned char a = 1;
unsigned char b = 2;
int c = a - b;
Run Code Online (Sandbox Code Playgroud)

当使"c"成为无符号字符时,我可能会得到255.当我使用这样的int时会发生什么?

c int casting overflow char

7
推荐指数
1
解决办法
3078
查看次数

C中的类型推广

我对以下代码感到困惑:

#include <stdio.h>
#include <stdint.h>

int main(int argc, char ** argv)
{
    uint16_t a = 413;
    uint16_t b = 64948;

    fprintf(stdout, "%u\n", (a - b));
    fprintf(stdout, "%u\n", ((uint16_t) (a - b)));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

返回:

$ gcc -Wall test.c -o test
$ ./test
4294902761
1001
$ 
Run Code Online (Sandbox Code Playgroud)

似乎表达式(a-b)具有类型uint32_t.我不明白为什么因为两个运算符都是uint16_t.

任何人都可以向我解释这个吗?

c types integer-promotion

6
推荐指数
2
解决办法
7619
查看次数

表达式的类型

考虑一下C++程序的以下部分; 打印到控制台的值作为注释给出.

{ // case 1
unsigned int x = 10; 
unsigned int y = 20; 
std::cout << "u/u x - y: " << x-y << std::endl; // 4294967286
}   

{ // case 2
int x = 10; 
int y = 20; 
std::cout << "s/s x - y: " << x-y << std::endl; // -10
}   

{ // case 3
unsigned int x = 10; 
int y = 20; 
std::cout << "u/s x - y: " << x-y << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c c++ language-lawyer

3
推荐指数
1
解决办法
733
查看次数

检查数字是否在范围内时,使用unsigned int进行翻转问题

我试图检查收到的消息号是否在给定范围内.每次消息号增加时.如果我期待数字10,我接受任何号码为10+的消息.所以序列号为10到15.我使用的是unsigned int.因此,当预期数量为65532时,我可以接受65532 + 10(所以min = 65532和max = 5).如何检查我收到的号码是否在此范围内?

c c++

3
推荐指数
1
解决办法
2551
查看次数

为什么这个sizeof(c + a)给出4个字节而不是3个字节

#include <stdio.h>
int main()
{
   short int a;
   char c;
   printf("%d %d %d",sizeof(a),sizeof(c),sizeof(c+a));
}
Run Code Online (Sandbox Code Playgroud)

在这个sizeof a中,2字节大小的char是1字节但是我把它们加起来它给4字节.它在表达式中做了什么使其成为4

c int sizeof short char

2
推荐指数
1
解决办法
182
查看次数

逐字节打印4字节整数时出现意外行为

我有这个示例代码,用于将32位整数转换为ip地址.


#include <stdio.h>
int main()
{
 unsigned int c ;
 unsigned char* cptr  = (unsigned char*)&c ;
 while(1)
 {
  scanf("%d",&c) ;
  printf("Integer value: %u\n",c);
  printf("%u.%u.%u.%u \n",*cptr, *(cptr+1), *(cptr+2), *(cptr+3) );
 }
}
Run Code Online (Sandbox Code Playgroud)

此代码为输入提供了错误的输出2249459722.但当我更换

scanf("%d",&c) ;
Run Code Online (Sandbox Code Playgroud) 通过
scanf("%u",&c) ;
Run Code Online (Sandbox Code Playgroud) 输出结果是正确的.

PS:我知道inet_ntopinet_pton.
我期待的答案不仅仅是建议那些答案.

c scanf ip-address endianness

1
推荐指数
2
解决办法
4812
查看次数

C中的三元条件运算符

(k < m ? k++ : m = k)

此特定表达式给出了编译时错误,表示需要左值.问题在于k++.无法理解此表达式中的错误.

c turbo-c

1
推荐指数
1
解决办法
386
查看次数

8位MCU中的32位可变移位

我使用32位变量将4个8位值存储到一个32位值中.

32_bit_buf[0]= cmd[9]<<16 | cmd[10]<<8| cmd[11] <<0;
Run Code Online (Sandbox Code Playgroud)

cmd 是带有数据的unsigned char类型

cmd [9]=AA
cmd[10]=BB
cmd[11]=CC
Run Code Online (Sandbox Code Playgroud)

但是,当打印32位变量时,我得到了0xFFFFBBCC.

架构 - 8位AVR Xmega

语言-C

任何人都可以找出我出错的地方.

c avr

0
推荐指数
1
解决办法
435
查看次数

8051 16位加法/乘法结果16位而不是32位

我有个问题.在此程序中,变量x应设置为0x10000,但在两个操作中结果为0.

这不是主程序,而是查找错误原因的测试.我目前正在使用十六进制输入制作64位乘法器.我使用Keil和Proteus进行了16位乘法运算

int main() {
    unsigned long int x = 0;
    x = 0x8000 * 0x2;
    x = 0x8000 + 0x8000;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c 16-bit integer-promotion integer-arithmetic

-2
推荐指数
1
解决办法
443
查看次数