Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从命令行传递参数时*argv[]中字符的大小_C_Unicode_Utf 8_Char - Fatal编程技术网

C 从命令行传递参数时*argv[]中字符的大小

C 从命令行传递参数时*argv[]中字符的大小,c,unicode,utf-8,char,C,Unicode,Utf 8,Char,我有一个简单的程序 包括 包括 如果sizeofchar总是1字节,我不明白ffffff从何而来 根据定义,sizeofchar为1,但'●' 不是C意义上的字符,生成3个字符 您的字符是可见签名的。在您的情况下,默认情况下,每个字符都是有签名的字符● 产生每3个负代码,因为在你的情况下你的字符被转换成一个int 32,格式%x考虑没有符号的参数,你有这些输出 执行printf%x,-30;->ffffffe2 int i=0时应注意的事项;iffffffe2 int i=0时应注意的事项;i

我有一个简单的程序

包括 包括 如果sizeofchar总是1字节,我不明白ffffff从何而来

根据定义,sizeofchar为1,但'●' 不是C意义上的字符,生成3个字符

您的字符是可见签名的。在您的情况下,默认情况下,每个字符都是有签名的字符● 产生每3个负代码,因为在你的情况下你的字符被转换成一个int 32,格式%x考虑没有符号的参数,你有这些输出

执行printf%x,-30;->ffffffe2

int i=0时应注意的事项;i 在检查argv[1]之前,最好先检查argc是否至少为1

如果sizeofchar总是1字节,我不明白ffffff从何而来

根据定义,sizeofchar为1,但'●' 不是C意义上的字符,生成3个字符

您的字符是可见签名的。在您的情况下,默认情况下,每个字符都是有签名的字符● 产生每3个负代码,因为在你的情况下你的字符被转换成一个int 32,格式%x考虑没有符号的参数,你有这些输出

执行printf%x,-30;->ffffffe2

int i=0时应注意的事项;i 最好先检查argc是否至少为1,然后再检查argv[1]

printf是一个接受可变数量参数的函数

小于int类型的任何整型参数都会自动转换为int类型

显然,在您的实现中,字符little round thing由3个字符组成,所有字符都带有负值

试试这些

printf("%x ", (unsigned char)argv[1][i]);
printf("%hhx ", argv[1][i]); // thanks to Jonathan Leffler
printf是一个接受可变数量参数的函数

小于int类型的任何整型参数都会自动转换为int类型

显然,在您的实现中,字符little round thing由3个字符组成,所有字符都带有负值

试试这些

printf("%x ", (unsigned char)argv[1][i]);
printf("%hhx ", argv[1][i]); // thanks to Jonathan Leffler

UTF-8代码单位用于多代码单位代码点,除ASCII之外的所有代码都在128到255之间,这意味着超出了ASCII范围

printf是一个vararg函数,传递给vararg部分的所有参数(格式字符串除外)都受标准升级的约束

由于您的实现的裸字符是8位带符号的2s补码,这意味着UTF-8 codeunit值是负数,介于-1和-128之间,升级后您将得到一个具有该值的int

然后你对printf撒谎,声称它是一个无符号的%x代表无符号整数,而2s补码会导致你的未定义行为打印一个非常大的无符号整数


使用%hhx可以得到正确的结果,但严格来说,应该将参数强制转换为无符号字符。

UTF-8对于多代码单元代码点,除ASCII之外的所有代码单元都在128到255之间,这意味着超出了ASCII范围

printf是一个vararg函数,传递给vararg部分的所有参数(格式字符串除外)都受标准升级的约束

由于您的实现的裸字符是8位带符号的2s补码,这意味着UTF-8 codeunit值是负数,介于-1和-128之间,升级后您将得到一个具有该值的int

然后你对printf撒谎,声称它是一个无符号的%x代表无符号整数,而2s补码会导致你的未定义行为打印一个非常大的无符号整数


使用%hhx可以得到正确的结果,但严格来说,您应该将参数转换为unsigned char。

相反,在他的实现中,char有一个符号,并且所有多代码单元代码点只包含大于127的代码单元,因此8bit 2s补码为负数。@重复数据消除器:您的意思是strlenlittle round thing==3表示1个多代码单元码点或3个字符?我改变了答案:是的,但这不是真正重要的部分。或者%hhx是转换规范。或者包括并打印%PRIx8,uint8_targv[1][I];使用精确的宽度类型。相反,在他的实现中,char有一个符号,所有多代码单元代码点只包含大于127的代码单元,因此在8bit 2s补码中为负数。@重复数据消除器:您的意思是strlenlittle round thing==3表示1个多代码单元代码点或3个字符?我改变了答案:是的,但这不是真正重要的部分。或者%hhx是转换规范。或者包括并打印%PRIx8,uint8_targv[1][I];使用精确宽度类型。Thansk表示有价值的建议。Thansk表示有价值的建议。