假设我有 3 个变量: a long、 anint和 a short。
long l;
int i;
short s;
long lsum;
Run Code Online (Sandbox Code Playgroud)
如果这是纯数学,因为乘法具有可交换性,所以这些变量的顺序无关紧要。
l * i * s = i * s * l = s * i * l.
Run Code Online (Sandbox Code Playgroud)
让lsum成为这 3 个变量相乘的容器。
在 C 中,是否会出现这些变量的特定顺序导致不同结果的情况?
如果在某种情况下顺序确实很重要,不一定来自这个例子,那会是什么?
我不明白0xff的补码怎么不是0x00.这是代码:
uint8_t u8a;
u8a = 0xff;
printf( "%d\n", ~u8a );
if( ~u8a == 0x00 )
printf( "Equal\n" );
else
printf( "Not Equal\n" );
Run Code Online (Sandbox Code Playgroud)
该printf语句显示"-256"和"不等于".我的理解中缺少什么?如果它被提升为int类型,为什么它会被提升为int类型?
我正在读一本书,标题为“理解和使用C指针”。在第110页上,这些行如下:
...但是,在某些编译器(例如GCC)中,可以修改字符串文字。考虑以下示例:
Run Code Online (Sandbox Code Playgroud)char *tabheader = "Sound"; *tabheader = 'L'; printf("%s\n", tabheader); //Displays "Lound"
继续并描述其用法const char *tabheader将阻止修改此变量。
我目前正在使用Cloud 9 / Ubuntu。我使用GCC编译了这段代码并运行了它。segmentation fault如我所料,它导致了错误。
我对书中的这些陈述感到非常困惑。一直以来,我对语句的理解char *tabheader = "Sound";与const char *tabHeader = "Sound"; 现在相同,这本书在说,这取决于哪个gcc编译器
我的问题是:哪个GCC编译器允许运行此代码?你对此的看法如何?这也属于未定义的行为吗?
当下面的代码针对像MSP430微控制器这样的16位整数机运行时,s32得到65446.
#include <stdint.h>
uint16_t u16c;
int32_t s32;
int main()
{
u16c = 100U;
s32 = 10 - u16c;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是10 - u16c获取unsigned int的隐式类型提升.数学上10 - u16c等于-90.但是如何将负数表示为unsigned int呢?当-90被提升为unsigned int时,是否意味着忽略了数字的符号?
让我们假设,数字的符号被忽略.
90的二进制表示是00000000 01011010.当这被分配给s3232位宽的有符号整数变量时,转换是如何发生的?
为了s32等于65446,90必须采用2的补码.那就是00000000 10100110.
我不了解s32成为65446 的过程.
在像ARM这样的32位宽整数机器中,s32是-90,这是正确的.
要修复在16位整型机这种情况下,需要的类型转换(int16_t)为u16c.这是如何解决这个问题的?
添加s32了IAR Workbench(右下角)所示的hexa数据表示.它显示s32成为0x0000FFA6.因此,对于MSP430,从无符号16位转换为带符号32位的机器实现,它只是预先设置16 0位.