所以我知道有符号和无符号int之间的区别在于,有一些用于表示数字是正数还是负数,但这如何适用于char?角色怎样才能是积极的还是消极的?
我正在尝试将char打印为正值:
char ch = 212;
printf("%u", ch);
Run Code Online (Sandbox Code Playgroud)
但我得到:
4294967252
Run Code Online (Sandbox Code Playgroud)
我如何212进入输出?
如果char在C(使用gcc)中签名或未签名,会导致什么?我知道,标准并没有规定一个比其他,我也可以检查CHAR_MIN,并CHAR_MAX从limits.h中,但我想知道是什么原因引发了另一种使用GCC时
如果我从libgcc-6读取limits.h,我看到有一个宏__CHAR_UNSIGNED__定义了一个"默认"char签名或无符号但我不确定这是由编译器在(他)的构建时间设置的.
我试图列出GCC预定义的makros
$ gcc -dM -E -x c /dev/null | grep -i CHAR
#define __UINT_LEAST8_TYPE__ unsigned char
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 0x7fffffff
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __SCHAR_MAX__ 0x7f
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __UINT8_TYPE__ unsigned char
#define __INT8_TYPE__ signed char
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __CHAR16_TYPE__ short unsigned int
#define __INT_LEAST8_TYPE__ signed char
#define __WCHAR_TYPE__ int
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 4
#define __INT_FAST8_TYPE__ signed char
#define …Run Code Online (Sandbox Code Playgroud) int main()
{
char c = 0xff;
bool b = 0xff == c;
// Under most C/C++ compilers' default options, b is FALSE!!!
}
Run Code Online (Sandbox Code Playgroud)
C或C++标准都没有将char指定为有符号或无符号,它是实现定义的.
为什么C/C++标准没有明确地将char定义为有符号或无符号以避免像上述代码那样的危险误用?
我正在尝试自己学习C,我有点困惑getchar和putchar:
#include <stdio.h>
int main(void)
{
char c;
printf("Enter characters : ");
while((c = getchar()) != EOF){
putchar(c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
int main(void)
{
int c;
printf("Enter characters : ");
while((c = getchar()) != EOF){
putchar(c);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C库函数int putchar(int c)将参数char指定的字符(unsigned char)写入stdout.
C库函数int getchar(void)从stdin获取一个字符(一个unsigned char).这相当于以stdin作为参数的getc.
这是否意味着putchar()同时接受int和char或其中一方以及getchar()我们应该使用一个int或char?
为什么C/C++ stdlibs中的大多数字符串函数都需要char*指针?
的签署岬char在标准甚至没有规定,但最现代的编译器(GCC,MSVC)对待char作为默认签名.
什么时候将字符串视为(可能)有符号字节?AFAIK在任何字符集中都没有低于零的有意义的字符值.对于某些字符串操作,unsigned char无论如何都必须强制转换值.
那么为什么stdlibs会使用char*?甚至C++特定的方法,如string::string(const char *);?
被 unsigned long int equivlant来unsigned long?在C++中
在我看来,他们是一样的.但是我看到有些人仍然在代码中使用unsigned long int.不明白为什么?任何人都可以帮我解释一下
#include <stdio.h>
int main() {
unsigned long int num = 282672;
int normalInt = 5;
printf("");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 根据环境和编译器设置,char默认情况下类型可以是有符号或无符号的,这意味着8位2s补码系统上单个字符常量的值范围可以是-128..127或0..255.
在无处不在的ASCII字符集中,其ISO-8859-X扩展或UTF-8编码,大写和小写字母以及数字的值低于127.
但是EBCDIC字符集不是这种情况:
'A'是0xC1,'a'是0x81并且'1'是0xF1.
由于这些值大于127,是否意味着该类型char必须在8位EBCDIC系统上无符号?或者可以'a','A' 并'1'有负值?
其他字符集怎么样?字母或数字可以有负值吗?