相关疑难解决方法(0)

隐式类型促销规则

本文旨在用作关于C中隐式整数提升的常见问题解答,特别是由通常的算术转换和/或整数提升引起的隐式提升.

示例1)
为什么这会给出一个奇怪的大整数而不是255?

unsigned char x = 0;
unsigned char y = 1;
printf("%u\n", x - y); 
Run Code Online (Sandbox Code Playgroud)

例2)
为什么这会给"-1大于0"?

unsigned int a = 1;
signed int b = -2;
if(a + b > 0)
  puts("-1 is larger than 0");
Run Code Online (Sandbox Code Playgroud)

示例3)
为什么更改上例中的类型来short解决问题?

unsigned short a = 1;
signed short b = -2;
if(a + b > 0)
  puts("-1 is larger than 0"); // will not print
Run Code Online (Sandbox Code Playgroud)

(这些示例适用于16位或短16位的32位或64位计算机.)

c type-conversion implicit-conversion

50
推荐指数
2
解决办法
7417
查看次数

哪个初始化程序适用于int64_t?

我喜欢将我的变量初始化为一些"虚拟"值,并开始使用int64_tuint64_t.到目前为止,看起来我至少有三种方法可以初始化int64_t一个特定的值(并且对于无符号的等价物稍有改动):

int64_t method_one   = 0;
int64_t method_two   = 0LL;
int64_t method_three = INT64_C(0);
Run Code Online (Sandbox Code Playgroud)

我使用GCC并针对OS X和Linux.我想选择一种旨在简化便携性和清晰度的方法 - 但最重要的是正确性.我是否过度思考这个,或者是否有一个"最佳"或"最推荐"的方法来初始化这个变量类型,对于我抛出的任何特定值(当然,它在其范围内)?

c gcc int64

13
推荐指数
2
解决办法
7938
查看次数

stdint.h 中的 {U,}INTn_C 宏有什么意义?

什么时候真正需要这些宏?

我的系统 (gcc/glibc/linux/x86_64)stdint.h使用__这些( -prefixed) 变体来定义:

# define INT64_MIN      (-__INT64_C(9223372036854775807)-1)
# define INT64_MAX      (__INT64_C(9223372036854775807))
# define UINT64_MAX     (__UINT64_C(18446744073709551615))
# define INT_LEAST64_MIN    (-__INT64_C(9223372036854775807)-1)
# define INT_LEAST64_MAX    (__INT64_C(9223372036854775807))
# define UINT_LEAST64_MAX   (__UINT64_C(18446744073709551615))
# define INT_FAST64_MIN     (-__INT64_C(9223372036854775807)-1)
# define INT_FAST64_MAX     (__INT64_C(9223372036854775807))
# define UINT_FAST64_MAX    (__UINT64_C(18446744073709551615))
# define INTMAX_MIN     (-__INT64_C(9223372036854775807)-1)
# define INTMAX_MAX     (__INT64_C(9223372036854775807))
# define UINTMAX_MAX        (__UINT64_C(18446744073709551615))
Run Code Online (Sandbox Code Playgroud)

然而,limits.h它似乎与:

#   define LONG_MAX 9223372036854775807L
#   define ULONG_MAX    18446744073709551615UL
Run Code Online (Sandbox Code Playgroud)

为什么不能stdint.h忘记_C宏并简单地做:

#   define INT_LEAST64_MAX  9223372036854775807 //let it grow …
Run Code Online (Sandbox Code Playgroud)

c language-lawyer

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